2017-03-10 1 views
2

Nach einer Woche von Versuchen muss ich dich das fragen.Formatierung der Ausgabe einer .txt in Powershell

Datei-Eingang:

DD/MM                    

27,28 

14,21                            
1                            
15                

7                             
12                             
2,15                             
25 

Jede Zeile dieser Datei einen Monat darstellt, also auch wenn Es ist leer, es sollte noch so die Formatierung zählen kann passieren. Dann basierend auf Dateieingabe, die gewünschte Ausgabe ist:

gewünschte Ausgabe:

DD/MM 
27/02 
28/02 
14/04 
21/04 
01/05 
15/06 
07/09 
12/10 
02/11 
15/11 
25/12 

Was habe ich bisher und stecken hier:

#getting the content into an array and formatting the .DAT file 
$lines = Get-Content $outfileBR 

If ($lines[0] -eq "DD/MM") { 
    $HEADER = $lines[0] + $linebreak 
} 

If ($lines[1] -eq '') { 
    continue 
} Else { 
    $BRFILE = $lines[1].SUBSTRING(0,2) + "/01" + $linebreak 
    $BRFILE += $lines[1].SUBSTRING(3,2) + "/01" + $linebreak   
} 

If ($lines[2] -eq '') { 
    continue 
} Else { 
    $BRFILE2 = $lines[2].SUBSTRING(0,2) + "/02" + $linebreak 
    $BRFILE2 += $lines[2].SUBSTRING(3,2) + "/02" + $linebreak 
} 

If ($lines[3] -eq '') { 
    continue 
} Else { 
    $BRFILE3 = $lines[3].SUBSTRING(0,2) + "/03" + $linebreak 
    $BRFILE3 += $lines[3].SUBSTRING(3,2) + "/03" + $linebreak 
} 

Set-Content $BRdatFile ($HEADER + $BRFILE + $BRFILE2 + $BRFILE3) 

Ergebnis:

DD/MM 
    /01 
    /01 
27/02 
28/02 
    /03 
    /03 

Wie ich schon sagte, jede Zeile bezieht sich auf einen Monat, aber wenn die Zeile leer ist (wie in der Eingabedatei gezeigt), werde ich sie nicht in der Ausgabe anzeigen. Aber auf meinem Ergebnis erscheint es als/01 für Januar,/03 für März und so weiter.

Was mache ich bitte falsch?

+2

Ihre Eingabedatei enthält 12 Zeilen einschließlich der Kopfzeile, obwohl in Ihrem Screenshot der letzte Monat als Dezember (12) angezeigt wird. Ich glaube, du hast vergessen, nach der Zeile mit "15" (für Juni) eine Leerzeile einzufügen. –

+0

Hallo Ronald, danke für deine Hilfe hier. Das Kopieren und Einfügen funktionierte nicht sehr gut. Du hast Recht, eine leere Zeile für August fehlt nach 15. – DevHawk

Antwort

3

dies in Powershell zu erreichen, ist so einfach wie diese:

"DD/MM"; 
$lines = Get-Content $ENV:TEMP\input.txt; 
for($c = 1; $c -lt $lines.Count; $c++) 
{ 
    $line = $lines[$c]; 
    if(!$line) { continue; } 

    $line.Split(',') | % { '{0:00}/{1:00}' -f [int] $_, $c } 
} 

27/02 
28/02 
14/04 
21/04 
01/05 
15/06 
07/08 
12/09 
02/10 
15/10 
25/11 

bearbeiten: $day/$_

+0

_Eine kurze Frage, bevor ich versuche, deine Frage zu beantworten_ Wenn du dir nicht sicher bist, warum hast du geantwortet? Den OP in einem Kommentar zu fragen, wäre eine bessere Idee, nein? – Matt

+0

@Matt Ich studierte seine Ausgabe und kam zu dem Schluss, dass die Ausgabe nicht mit seiner Beschreibung übereinstimmt. Vielleicht hätte ich meinen ersten Satz als Kommentar hinzufügen sollen. Ich denke immer noch, dass meine Antwort richtig ist. Danke für den Hinweis –

+0

Ich stimme zu, dass Ihre Ausgabe _amost_ korrekt ist. Es sieht so aus, als ob das Op im Datum Schrägstriche haben möchte. Verzeih mir, ich war wählerisch mit deiner Formulierung. – Matt

4

Sehr ähnlich der Antwort von Ronald Rink 'd-fens' fixiert ist, würde ich Sie eine Schleife innerhalb einer Schleife, aber da wir wissen, wie viele Zeilen sollten in der Datei sein, würde ich dies tun:

#Get content of input file 
$FileIn = Get-Content C:\Path\To\File.txt 
#Start array for output with header record 
[array]$FileOut += 'DD/MM' 
#Loop 12 times, once for each month 
ForEach($Month in (1..12)){ 
    #Split the relevant line, and for each entry add a line to the output file 
    If([string]::IsNullOrEmpty($FileIn[$Month])){Continue} 
    $FileIn[$Month].Split(',') | ForEach{ 
     $FileOut += '{0}/{1}' -f $_, $Month 
    } 
} 
#Output the new file 
$FileOut | Set-Content C:\Path\To\NewFile.txt 

Edit: Ich habe 2 Probleme behoben. Ich hatte [1..2], was (1..12) hätte sein sollen, und benutzte die $_ Referenz anstelle von $Month (was sowieso funktionieren sollte, aber es ist eine schlechte Form imho).

+1

Hallo @TheMadTechnician Ich bekomme einen Fehler auf 'ForEach ($ Month in [1..12])' sagen 'Fehlende Typbezeichnung nach '[' .' (läuft PoSH 5.1.14393.693 unter Windows 10. –

+0

Hier sind ein paar Vorschläge Korrekturen: '[array] $ FileOut = @ ('DD/MM')', '[1..12] -> @ (1..12)', $ FileIn [$ _] -> $ FileIn [$ Month] ', und' -f $ _ -> -f $ _. Trim() ' – BenH

+0

@BenH Guter Aufruf! Da es eine Schleife ist, wird es technisch mit' $ _' arbeiten, aber ich sollte '$ Month' verwenden Ich werde die Antwort aktualisieren. – TheMadTechnician