• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Große CSV-Datei parsen

Katzenfutter

Kaiser Wilhelm
Registriert
16.12.06
Beiträge
174
Hallo...
Stehe grade vor einem größeren Problem.
Meine Aufgabe: ich muss eine ca. 27MB umfassende CSV-Datei parsen und deren Inhalt letztendlich in eine Datenbank pressen. Letzteres dürfte kein größeres Problem darstellen, MySQL ist da recht gutmütig...

Nur Java bereitet mir grade Kopfschmerzen.
Eine unschöne Lösung (oder auch schön, Ansichtssache!) habe ich: ich lasse immer nur eine Zeile einlesen, parse sie, schreibe sie in die DB und lese die nächste... solange bis EndOfFile.

Hat jemand ne andere, eventuell bessere Lösung für mein kleines CSV-Problem?

Help is much appreciated!
 
grafisch? Baust' halt AppleScript drumrum...

crossplattform? Nimmst halt Tcl/Tk ;-)

Wie auch immer: Wo ist das Problem? Wenn die Zeilen nicht gigantomanisch lang sind (naja, < 27MB schätze ich) liest Du halt Zeile für Zeile ein und pumpst es in die Datenbank. Sowas sollte Java doch locker hinbekommen.

Also ich sehe da keine Probleme. Zumindest keine, die Du hier beschrieben hättest.
 
Eine unschöne Lösung (oder auch schön, Ansichtssache!) habe ich: ich lasse immer nur eine Zeile einlesen, parse sie, schreibe sie in die DB und lese die nächste... solange bis EndOfFile.

Zumindest das "Schreiben in die Datenbank" könntest du mit Hilfe eines Puffers eleganter machen, indem du immer erst n Einträge sammelst und diese dann in einem Rutsch wegschreibst. Dazu würde sich ein BatchStatement (siehe addBatch in PreparedStatement) anbieten.
Bringt Performance-mäßig vor allem dann etwas, wenn die Datenbank auf einem externen Host läuft und du dich via Netzwerk zu ihr verbindest.
 
jdbc -> autocommit ausschalten und die sql statements vernünftig zu batches zusammenfassen. Dann gibts keine Probleme. 27MB sind ja nun auch nicht sooo viel - das würde ja sogar noch in den Speicher passen <duckundrenn>
 
Also ich sehe da jetzt auch nicht so das Problem.

27MB ist jetzt auch nicht sooo irre viel.

Wie liest Du denn genau die Daten ein?
 
FileReader, meinetwegen BufferedReader, mit den gängigen Readern eben.
Muss die einzelnen Reihen aus der CSV-Datei noch parsen, da das Ganze ein leicht seltsames Format hat...
Bin da ein bißchen am Rumspielen, grade auch was JDBC angeht.
Muss dabei auch ein bisschen auf die Performance achten... der Heap wird bei 27MB Daten schon knapp ;)
 
Und das übliche

Code:
		BufferedReader bufferedReader = new BufferedReader(new FileReader(path));
		String tmpLine = null;
		while((tmpLine = bufferedReader.readLine())!=null) {
			//Verarbeitun
		}

taugt dir nicht?

Ich hab damit gerade testhalber ein 50MB Datei eingelesen und das lief wunderbarst.
Die SQL-Statemens würde ich halt nicht unbedingt "sammeln" und dann abschiessen.
 
Die Lösung liegt in einem einzigen SQL-Statement.
MySQL liest auch CSV-Dateien ein und schreibt sie, wie gewünscht vergleichbar einem INSERT-Statement, in die Datenbank.

Wen das Statement interessiert, einfach fragen :)