caerwi
Goto Top

Abgleich großer csv Dateien mit Powershell funktioniert nicht

Hallo,

ich möchte 2 csv Dateien abgleichen und die Unterschiede in einer dritten Datei ausgeben lassen.

Dies funktioniert auch mit einer Testdatei die 10.000 Zeilen hat in wenigen Sekunden.

Wenn ich das selbe aber mit der echten Datei mache, die ca. 600.000 Zeilen hat passiert nichts.
Schaue ich im TaskManager dann finde ich den Prozess mit ca.
20% Prozessor- und 2GB Arbeitsspeicherauslastung (egal ob ich nach 1 min. oder nach 30 min. schaue)

Ist das für Powershell zu groß oder gibt es hier einen Trick dass man den Vergleich z.B. in mehreren steps durchführt?


Für Hilfe wäre ich sehr dankbar.
Viele Grüße Carsten


So sieht der Befehl aktuell aus:


@echo off
set "file1=C:\2018\vp\c2\roh\C2_Update_alt.csv"
set "file2=C:\2018\vp\c2\roh\C2_Update.csv"
set "fileDiff=C:\2018\vp\c2\Update.csv"
Powershell -ExecutionPolicy Bypass -NoP -C "compare (gc '%file1%') (gc '%file2%') -Passthru | ?{$_.SideIndicator -eq '=>'} | sc '%fileDiff%'"

Content-Key: 610279

Url: https://administrator.de/contentid/610279

Printed on: April 19, 2024 at 11:04 o'clock

Member: Lochkartenstanzer
Lochkartenstanzer Oct 04, 2020 at 18:29:28 (UTC)
Goto Top
Zitat von @CaErWi:

Hallo,

ich möchte 2 csv Dateien abgleichen und die Unterschiede in einer dritten Datei ausgeben lassen.

Dies funktioniert auch mit einer Testdatei die 10.000 Zeilen hat in wenigen Sekunden.

Wenn ich das selbe aber mit der echten Datei mache, die ca. 600.000 Zeilen hat passiert nichts.
Schaue ich im TaskManager dann finde ich den Prozess mit ca.
20% Prozessor- und 2GB Arbeitsspeicherauslastung (egal ob ich nach 1 min. oder nach 30 min. schaue)

Ist das für Powershell zu groß oder gibt es hier einen Trick dass man den Vergleich z.B. in mehreren steps durchführt?

Moin,

Wie stark unterscheiden sich denn die beiden Dateien? je nach Alghoritmus kann das durchaus zu exponentiellem Wachstum in CPU und im Speicherverbrauch führen, wenn die sehr viele Unterschiede da sind und die Dateien sehr groß werden.

Eventuell solltest Du ins Auge fassen, da spezielle diff-programme zu nutzen.

lks
Member: CaErWi
CaErWi Oct 04, 2020 at 18:40:39 (UTC)
Goto Top
Hi Iks,

die Spalte 1 ist bei beiden Tabellen gleich und es sind in beiden Tabellen gleich viele Zeilen.

in Spalte 2, 3 und 4 kann es bei ca. 50.000 - 100.000 Zeile Änderungen geben.
Dann muß ich wohl man nach diff Programmen suchen, die über die Kommandozeile ausgeführt werden können?
Member: Lochkartenstanzer
Lochkartenstanzer Oct 04, 2020 at 19:09:18 (UTC)
Goto Top
Zitat von @CaErWi:

Hi Iks,

die Spalte 1 ist bei beiden Tabellen gleich und es sind in beiden Tabellen gleich viele Zeilen.

in Spalte 2, 3 und 4 kann es bei ca. 50.000 - 100.000 Zeile Änderungen geben.

D.h. Du hast gleich viele Zeilen und Differenzen sind in beiden Dateien jeweils in der gleichen Zeilennummer?

Dann muß ich wohl man nach diff Programmen suchen, die über die Kommandozeile ausgeführt werden können?

Wenn das wie oben vermutet wirklich gleich viele Zeilen sind und keine eingefügten oder weggelassenen Zeilen gibt, so könntest Du einfach die großen Dateien in kleinere Splitten vergleichen und die Ergebnisse hinterher wieder zusammenzuführen. Oder Du vergleichst einfach zeilenweise per Skript.

lks
Member: CaErWi
CaErWi Oct 04, 2020 at 19:16:09 (UTC)
Goto Top
Das splitten der Dateien wäre denkbar - aber kann ich dann alle Zeilen mit Veränderungen in eine Datei zusammenschreiben oder müsste dann für jede kleine Datei die verglichen wurde eine separate neue Datei geschrieben werden.

Ich bräuchte eine Lösung dass ich alle veränderten Zeilen in einer Datei habe.
Member: em-pie
em-pie Oct 04, 2020 at 20:22:36 (UTC)
Goto Top
Moin,

Wäre es eine Option, die Daten in eine kleine DB zu schieben und erst dann zu vergleichen und wieder zu exportieren?

Bzw. Die Quellen über Tools wie Knime, OpenTalend oder PowerBI direkt zu extrahieren und zu vergleichen?

Gruß
em-pie
Mitglied: 146189
146189 Oct 05, 2020 updated at 11:06:08 (UTC)
Goto Top
Gerade mal mit zwei Test-Files à 600000 Zeilen getestet (jedes File ist 20MB groß), dauer ca. 10 Sekunden mit der Powershell, die Hauptzeit geht hauptsächlich beim Einlesen der Dateien in ein Array flöten (gc), mit Import-CSV und Angabe der zu vergleichenden Spalten kannst du das noch optimieren. Oder -ReadCount Parameter bei gc.

Mit der Bash und "diff" ist das übrigens in einem Bruchteil einer Sekunden erledigt face-wink.