• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> 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!
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
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.
 

Trapper

Meraner
Registriert
12.05.05
Beiträge
231
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.
 

smile

Klarapfel
Registriert
11.01.05
Beiträge
279
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>
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
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?
 

Katzenfutter

Kaiser Wilhelm
Registriert
16.12.06
Beiträge
174
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 ;)
 

MatzeLoCal

Rheinischer Bohnapfel
Registriert
05.01.04
Beiträge
2.422
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.
 

Katzenfutter

Kaiser Wilhelm
Registriert
16.12.06
Beiträge
174
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 :)