none
löschen von Zeilen in großen csv Dateien RRS feed

  • 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 Zeilen

    clear-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

    Dienstag, 2. Juli 2019 07:16

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''

    Dienstag, 2. Juli 2019 07: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''

    Dienstag, 2. Juli 2019 07: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

    Dienstag, 2. Juli 2019 10:03
  • Mach ft weg, damit machst Du alles kaputt.

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Dienstag, 2. Juli 2019 10:33
  • 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

    Dienstag, 2. Juli 2019 16:21
  • vielen Dank für eure Hilfe, habe jetzt viel Zeitersparnis und gleich noch wieder einiges in PS gelernt

    Danke an alle

    Mittwoch, 3. Juli 2019 09:26
  • Anmerkung am Rande. Mit Power BI kannst du im Excel auch mehr als 1mio Zeilen problemlos verarbeiten bzw. auswerten. 

    Chris

    Mittwoch, 3. Juli 2019 18:25