Ich suche nach zusätzlichen Trennzeichen in meiner Datei auf einer Zeile für Zeile Basis. Ich möchte jedoch die Kopfzeile (erste Zeile) und die Fußzeile (letzte Zeile) in der Datei ignorieren und nur auf das Dateidetail konzentrieren.Powershell - Schwierigkeiten beim Ignorieren der Kopfzeile (erste Zeile) und Fußzeile (letzte Zeile) in Datei
Ich bin nicht sicher, wie die erste und letzte Zeile mit der ReadLine()
Methode zu ignorieren. Ich möchte die Datei in keiner Weise ändern, dieses Skript wird nur verwendet, um Zeilen in der CSV-Datei zu identifizieren, die zusätzliche Trennzeichen haben.
Bitte beachten Sie: Die Datei, nach der ich suchen möchte, hat Millionen von Zeilen. Um das zu tun, muss ich mich auf die Methode ReadLine()
anstatt auf Get-Content
verlassen.
Ich habe versucht, Select-Object -Skip 1 | Select-Object -SkipLast 1
in meiner Get-Content
Anweisung zu verwenden, die den Wert in $measure
eingibt, aber ich erhielt nicht das gewünschte Ergebnis.
Zum Beispiel:
H|Transaction|2017-10-03 12:00:00|Vendor --> This is the Header
D|918a39230a098134|2017-08-31 00:00:00.000|2017-08-15 00:00:00.000|SLICK-2340|...
D|918g39230b095134|2017-08-31 00:00:00.000|2017-08-15 00:00:00.000|EX|SRE-68|...
T|1268698 Records --> This is Footer
Grundsätzlich möchte ich mein Skript die Kopf- und Fußzeile, ignorieren und die ersten Datenreihe (D|918...
) als Beispiel für eine korrekte Aufzeichnung und die anderen Detailaufzeichnungen nutzen zu Vergleich gegen sie für Fehler (in diesem Beispiel sollte die zweite Detailzeile zurückgeführt werden, da es einen ungültiger Begrenzer in dem das Feld (EX|SRE-68...
).
Wenn I unter Verwendung -skip 1
und -skiplast 1
in der Anweisung get-content
versuchte, ist das Verfahren noch immer Verwenden der Kopfzeile als Vergleich und Rückgabe aller Detailsätze als ungültige Datensätze.
Hier ist, was ich bisher haben ...
Anmerkung der Redaktion: Trotz der angegebenen Absicht, dieser Code nicht verwendet die Header Linie (die erste Zeile) die Referenzspaltenanzahl zu bestimmen.
$File = "test.csv"
$Delimiter = "|"
$measure = Get-Content -Path $File | Measure-Object
$lines = $measure.Count
Write-Host "$File has ${lines} rows."
$i = 1
$reader = [System.IO.File]::OpenText($File)
$line = $reader.ReadLine()
$reader.Close()
$header = $line.Split($Delimiter).Count
$reader = [System.IO.File]::OpenText($File)
try
{
for()
{
$line = $reader.ReadLine()
if($line -eq $null) { break }
$c = $line.Split($Delimiter).Count
if($c -ne $header -and $i -ne${lines})
{
Write-Host "$File - Line $i has $c fields, but it should be $header"
}
$i++
}
}
finally
{
$reader.Close()
}
Danke the_sw und mklement0 für Ihre Hilfe! Dateien, die ich durchsuchen möchte, sind manchmal Millionen von Zeilen groß und bei Verwendung der Get-Content-Methode scheint es eher schlecht zu funktionieren. Zum Beispiel dauert es etwa eine halbe Stunde für eine Datei, die 500.000 Zeilen groß ist, mit der Get-Content-Methode. – Pavan