Wie kann ich eine große Datei über CSVParser verarbeiten?

8

Ich habe eine große .csv -Datei (etwa 300 MB), die von einem entfernten Host gelesen und in eine Zieldatei geparst wird, aber ich muss nicht alle Zeilen in die Zieldatei kopieren. Während des Kopierens muss ich jede Zeile aus der Quelle lesen, und wenn sie ein Prädikat übergibt, füge die Zeile zur Zieldatei hinzu.

Ich nehme an, dass Apache CSV ( apache.commons.csv ) nur ganze Dateien analysieren kann

%Vor%

Ich kann BufferedReader nicht verwenden. Basierend auf meinem Code sollte eine new CSVParser() Instanz für jede Zeile erstellt werden, was ineffizient aussieht.

Wie kann ich im obigen Fall eine einzelne Zeile (mit bekanntem Header der Tabelle) analysieren?

    
Alex Orlov 20.08.2015, 16:51
quelle

2 Antworten

10

Unabhängig davon, was Sie tun, werden alle Daten aus Ihrer Datei auf Ihren lokalen Computer übertragen, da Ihr System sie analysieren muss, um die Gültigkeit zu ermitteln. Ob die Datei über eine Datei eintrifft, die durch den Parser gelesen wird (so dass Sie jede Zeile analysieren können), oder ob Sie einfach die gesamte Datei für Parsing-Zwecke kopieren, es wird alles auf lokal übertragen. Sie müssen die Daten lokal erhalten und dann den Überschuss abschneiden.

Der Aufruf von csvFileParser.getRecords() ist bereits ein verlorener Kampf, weil Dokumentation erklärt, dass diese Methode jede Zeile Ihrer Datei in den Speicher lädt. Um den Datensatz zu analysieren und gleichzeitig aktiven Speicher zu sparen, sollten Sie stattdessen über jeden Datensatz iterieren. Die Dokumentation besagt, dass der folgende Code jeweils einen Datensatz in den Speicher lädt:

%Vor%

Da Sie erklärt haben, dass "filePath" nicht lokal ist, ist die obige Lösung aufgrund von Konnektivitätsproblemen fehleranfällig. Um Konnektivitätsprobleme zu vermeiden, empfehle ich Ihnen, die gesamte Remote-Datei auf local zu kopieren, sicherzustellen, dass die Datei korrekt kopiert wird, indem Sie Prüfsummen vergleichen, die lokale Kopie analysieren, um Ihre Zieldatei zu erstellen, und anschließend die lokale Kopie löschen.

    
JoshDM 20.08.2015 18:28
quelle
0

Dies ist eine späte Antwort, aber Sie können ein BufferedReader mit dem CSVParser verwenden:

%Vor%     
K Raphael 04.01.2018 20:58
quelle