
Ich habe eine große Anzahl von ASCII-Textdateien, die ich mit dem in der Datei gefundenen Inhalt ändern und dann alle zu einer Übersichtsdatei zusammenfügen muss. Mit einem schrittweisen Ansatz hatte ich bisher mäßigen Erfolg. Aber ich würde das gerne auf einen Schlag machen und habe es nicht hinbekommen. Ich habe ein Skript in PowerShell geschrieben, das für eine Datei das tut, was ich will, aber ich kann nicht herausfinden, wie ich es für alle Dateien im Ordner ändern kann. Ich hatte Probleme mit der Schleife und den letzten Abschnitten zur Dateiverkettung.
Hier ist meine grundlegende Dateistruktur:
Datei1.txt
Zeile1 – abc123 – Kopfzeile (ich möchte die Zeichen 2, 3 und 4 hier entfernen und zu den Datenzeilen hinzufügen)
Zeile2 – Daten1
Zeile3 – Daten2
ZeileN – abc123 – Fußzeile (ein Duplikat der Kopfzeile)
Datei2.txt
Zeile1 – efg456
Zeile2 – Daten3
Zeile3 – Daten4
ZeileN – efg456
DateiN.txt
Zeile1 – hij789
Zeile2 – Daten5
Zeile3 – Daten6
ZeileN – hij789
Ich möchte, dass die endgültige Ausgabedatei die folgende Struktur hat, wobei Kopf- und Fußzeilen entfernt und der aus der Kopfzeile extrahierte Inhalt in einer neuen Spalte am Anfang der Datei steht (dies sind Dateien mit fester Breite):
Finale.txt
Zeile1 - bc1data1
Zeile2 - bc1data2
Zeile3 - fg4data3
Zeile4 - fg4data4
Zeile5 - ij7data5
Zeile6 - ij7data6
Ich konnte dies für eine Datei lösen und habe den folgenden Code eingefügt:
cd "C:\Data\Files\"
$S1 = Get-Content File1.txt -First 1
$S2 = $S1.Substring(2,3)
Get-Content File1.txt | ForEach-Object {Add-Content a.txt "$S2$_"}
Get-Content a.txt | Select -Skip 1 | Select -SkipLast 1 | Set-Content out.txt
# extract header line
# limit to characters of interest
# append to the beginning of each line in file
# append all files together w/o first & last line
Idealerweise könnte ich dies auch ohne die Junk-Datei a.txt tun, aber bisher habe ich es nur zum Laufen gebracht, indem ich in eine separate Datei geschrieben habe. Ich bin für alle Vorschläge/Tipps dankbar, da ich mit PowerShell noch relativ neu bin (nur wenige Stunden Übung).
Antwort1
## Q:\Test\2017\08\25\SU_1244148.ps1
Set-Location "C:\Data\Files\"
$Files = Get-ChildItem File*.txt
$Final = ForEach ($File in $Files){
$Content = Get-Content $File
$Prefix = $Content[0].Substring(1,3)
For ($i = 1;$i -lt $Content.Length-1;$i++){
"{0}{1}" -f $Prefix,$Content[$i]
}
}
$Final | Set-Content Final.txt
> gc .\Final.txt
bc1data1
bc1data2
fg4data3
fg4data4
ij7data5
ij7data6
Version 2verarbeitet große Dateien
## Q:\Test\2017\08\25\SU_1244148_2.ps1
#Set-Location "C:\Data\Files\"
$Files = (Get-ChildItem File*.txt|Sort)
$Final = '.\Final.txt'
## As we append to $Final initially clear
If (Test-Path $Final){Remove-Item $Final}
ForEach ($File in $Files){
$Reader = [IO.File]::OpenText($File)
$Header = $Reader.ReadLine()
$Prefix = $Header.SubString(1,3)
$Line = $Reader.ReadLine()
while ($Reader.Peek() -ge 0) {
$Prefix+$Line| Out-File $Final -Append
$Line = $Reader.ReadLine()
}
$Reader.Dispose()
}
Optimierter Code, um nicht auf nachfolgende Header testen zu müssen.
Die While-Schleife druckt die vorherige Zeile und liest die nächste, wobei die allerletzte Zeile gelöscht wird.