Benutzer mit den meisten Antworten
löschen von Zeilen in großen csv Dateien

Frage
-
Ich habe das Problem, dass ich sehr große csv Dateien mit mehr Zeilen bekommen, als excel verarbeiten kann.
Deshalb möchte ich bestimmte Zeilen vorab löschen, das funktioniert auch mit meinen script,
dauert aber echt Stunden.
Daher die Frage, geht das auch schneller ? Die csv Datei ist größer als 50MB und weit mehr als 1.048.576 Zeilenclear-Host
$file = Get-Content "S:\liste.csv"
$str | out-file S:\liste_1.csv -Encoding ascii # Inhalt der Datei löschen
foreach ($str in $file)
{
if ($str -like '*text*') {
# SubString ist nicht enthalten; die * sind bedingt erforderlich
} else {
$str | out-file S:\liste_1.csv -append -Encoding ascii # SubString ist enthalten -> Zeile wird an die Datei angehängt
}
}Hat jemand eine Lösung für höheres Tempo?
mfg Klaus
Antworten
-
Die Zeilen einzeln in eine Datei zu schreiben ist keine gute Idee. Die Datei immer wieder zum Schreiben zu öffnen, dann wieder zu schließen und den nächsten Schritt machen, bremst Dein Script. Besser wäre, die zu schreibenden Daten zu sammeln und sie in einem Rutsch in die Datei zu schreiben.
Noch schneller sollte das mit Select-String gehen. Diesem cmdlet kannst Du die komplette Datei "verfüttern" und brauchst keine Schleife in der du die einzelenen Zeilen beackerst.
Wenn das an Speed immer noch nicht genug ist, schau Dir mal bitte das Video von Chrissy LeMaire - PowerShell and SQL Server: My Journey to 200k Rows/Second an. Die Video-Qualität ist nich so dolle - aber darauf kommt's dabei ja nicht an. ;-)
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 8. Juli 2019 14:37
Alle Antworten
-
Die Zeilen einzeln in eine Datei zu schreiben ist keine gute Idee. Die Datei immer wieder zum Schreiben zu öffnen, dann wieder zu schließen und den nächsten Schritt machen, bremst Dein Script. Besser wäre, die zu schreibenden Daten zu sammeln und sie in einem Rutsch in die Datei zu schreiben.
Noch schneller sollte das mit Select-String gehen. Diesem cmdlet kannst Du die komplette Datei "verfüttern" und brauchst keine Schleife in der du die einzelenen Zeilen beackerst.
Wenn das an Speed immer noch nicht genug ist, schau Dir mal bitte das Video von Chrissy LeMaire - PowerShell and SQL Server: My Journey to 200k Rows/Second an. Die Video-Qualität ist nich so dolle - aber darauf kommt's dabei ja nicht an. ;-)
Live long and prosper!
(79,108,97,102|%{[char]$_})-join''
- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 8. Juli 2019 14:37
-
also ersteinmal vielen, vielen Dank,
von fast 2 h auf keine 5 min !!!
$Patterns = @(";-;")
$Path = "S:\test.csv"
$OutPath="c:\temp\errors"
Foreach($Pattern in $Patterns){
$OutPath="S:\"
$OutPath = "$OutPath\test2.csv"
$PatternLines = Select-String -path $Path -pattern $Pattern -notmatch | ft Line -auto
$PatternLines | Out-File -filepath $OutPath -encoding ascii #Ausgabe in ein File
}habe jetzt nur noch ein kleines Problem
oben stehen immer 2 Zeilen, wie bekomme ich es ohne hin ??
Line
----mfg Klaus
-
-
Da kann man ja fast nen Einzeiler draus machen :-)
Out-File -FilePath 'S:\test2.csv' -InputObject $( Select-String -path 'S:\test.csv' -pattern ';-;' -notmatch ) -Encoding ASCII
Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq