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
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?
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:
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.
Tags und Links java csv filtering large-files apache-commons-csv