none
Alle zwei Zeilen, die Texte zusammenführen RRS feed

  • Frage

  • Hallo,

    ich habe vor kurzem mit Windows PowerShell begonnen und habe nun ein kleines Problem bzw. komme nicht weiter. Ich habe ein Textdokument welches in etwa folgendermaßen aufgebaut ist:

    Datum1

    Text1

    Datum2

    Text2

    Das Datum gehört also zum Text der darunter steht (aa bb cc ..). Nun möchte ich zwecks weiterer Bearbeitungen den jeweiligen Text dem jeweiligen Datum hinzufügen. Also:

    Datum1 Text1

    Datum2 Text2

    Ich denke das man das möglicherweise mit join() bearbeiten kann, in diesem Fall bekomme ich das aber nicht hin und finde auch weder im Internet noch in meinem Buch dazu etwas. 

    Deshalb bitte ich um etwas Hilfe, bei dieser Angelegenheit. 

    Grüße,

    Jannes




    • Bearbeitet FakeWiener Mittwoch, 12. Juni 2013 18:38
    Mittwoch, 12. Juni 2013 17:07

Antworten

  • Hallo TheGullimonster,

    geht ganz simpel:

    $a = GC "C:\file.txt"
    $join = @()
    for($i = 0; $i -lt $a.count;$i=$i+2){
        $join += "$($a[$i]) $($a[$i+1])"
    }
    $join

    gruß
    speedy

    Donnerstag, 13. Juni 2013 06:16
  • Das Cmdlet Get-Content liest eine Textdatei Zeile für Zeile ein!
    Nun könnte man auf die Idee kommen, eine Zählschleife zu bauen und in dieser Zählschleife jede zweiten Zeile mit der vorderen zu verheiraten.
    Dies würde einfach mit einer Binären Berechnung anhand des Modulo % Operators geschehen!

    # Pseudo code!
    # Wenn Zähler Modulo 2 = 0 dann haben wie die 2. Zeile
     If( $Counter % 2 –eq 0) {  -join ($Zeile1, $Zeile2)  } 


    Der Code mit der Zählschleife ist aber sehr aufwändig, da man die $Zeile1 zwischenspeichern muss usw.

    Das Cmdlet Get-Content hat aber den Parameter –ReadCount mit dem geht das viel einfacher.
    ReadCount liefert ein Array von Zeilen auf jede Zeile kann man dann bequem zugreifen oder dieses Array einfach joinen!

    Get-Content -Path 'C:\Temp\test.txt' -ReadCount 2 | ForEach-Object {-join ($_)}
    #oder mit Leerzeichen dazwischen
    Get-Content -Path 'C:\Temp\test.txt' -ReadCount 2 | ForEach-Object {-join ($_[0],' ',$_[1])}

    Man sollte sich immer die Komplette Dokumentation zu einem Cmdlet durchlesen, erst dann weiß man was überhaupt möglich ist!
    Get-Help Get-Content –Full
    Oder
    http://www.colorconsole.de/PS_Windows/de/Get-Content.htm

    Join Dokumentation:

    Get-Help about_Join

    oder

    http://www.colorconsole.de/PS_Windows/de/about_join.htm


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    • Bearbeitet Peter Kriegel Donnerstag, 13. Juni 2013 06:27
    • Als Antwort markiert FakeWiener Donnerstag, 13. Juni 2013 06:36
    Donnerstag, 13. Juni 2013 06:21

Alle Antworten

  • Hallo TheGullimonster,

    geht ganz simpel:

    $a = GC "C:\file.txt"
    $join = @()
    for($i = 0; $i -lt $a.count;$i=$i+2){
        $join += "$($a[$i]) $($a[$i+1])"
    }
    $join

    gruß
    speedy

    Donnerstag, 13. Juni 2013 06:16
  • Das Cmdlet Get-Content liest eine Textdatei Zeile für Zeile ein!
    Nun könnte man auf die Idee kommen, eine Zählschleife zu bauen und in dieser Zählschleife jede zweiten Zeile mit der vorderen zu verheiraten.
    Dies würde einfach mit einer Binären Berechnung anhand des Modulo % Operators geschehen!

    # Pseudo code!
    # Wenn Zähler Modulo 2 = 0 dann haben wie die 2. Zeile
     If( $Counter % 2 –eq 0) {  -join ($Zeile1, $Zeile2)  } 


    Der Code mit der Zählschleife ist aber sehr aufwändig, da man die $Zeile1 zwischenspeichern muss usw.

    Das Cmdlet Get-Content hat aber den Parameter –ReadCount mit dem geht das viel einfacher.
    ReadCount liefert ein Array von Zeilen auf jede Zeile kann man dann bequem zugreifen oder dieses Array einfach joinen!

    Get-Content -Path 'C:\Temp\test.txt' -ReadCount 2 | ForEach-Object {-join ($_)}
    #oder mit Leerzeichen dazwischen
    Get-Content -Path 'C:\Temp\test.txt' -ReadCount 2 | ForEach-Object {-join ($_[0],' ',$_[1])}

    Man sollte sich immer die Komplette Dokumentation zu einem Cmdlet durchlesen, erst dann weiß man was überhaupt möglich ist!
    Get-Help Get-Content –Full
    Oder
    http://www.colorconsole.de/PS_Windows/de/Get-Content.htm

    Join Dokumentation:

    Get-Help about_Join

    oder

    http://www.colorconsole.de/PS_Windows/de/about_join.htm


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    • Bearbeitet Peter Kriegel Donnerstag, 13. Juni 2013 06:27
    • Als Antwort markiert FakeWiener Donnerstag, 13. Juni 2013 06:36
    Donnerstag, 13. Juni 2013 06:21
  • Ah mit -ReadCount geht das! Großer ahaa Moment, vielen Dank Peter.  :)

    Das Skript von speedcar343 funktioniert auch, danke für den Vorschlag.

    Grüße

    Jannes

    Donnerstag, 13. Juni 2013 06:36
  • Du kannst in diesem Forum auch mehrere richtige Antworten als Antwort Markieren!

    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 13. Juni 2013 08:26