Zeilenumbruch ignorieren möglich?

OnDemand

Top Contributor
Hallo zusammen, erstmal ein gesundes neues Jahr allerseits.

Ich habe eine CSV Datei wo in jeder Zeile ein Fahrzeug steht. Leider bekomm ich dich csv so wie sie ist (fehlerhaft) . Es gibt immer mal wieder Zeilen, wo ein Zeilenumbruch drin ist (wie im Bild) die ersten 2 Zeilen, sollten eigentlich auf einer Zeile sein, so wie es der LKW in der 3. Zeile ist.

Hat jemand eine Idee, wie ich dieese ungewollten Zeilenumbrüche ignorieren kann?

Wenn ich die Datei parse und mit
Java:
.split("\",\"");
splitte, klappt das auch, bis auf die besagten Zeilen, mit dem Umbruch da bekomm ich dann eine IndexOutOfBounds, weil ich auf die 5. Stelle im Array zugreifen will.

Habe schon versucht mit
Java:
parts[5].replaceAll("\n", "").replaceAll("\r", "")

aber das bringts auch nicht. Muss diesen doofen Umbruch da irgendwie weg bekommen, alternativ müsste ich das Fahrzeug überspringen, aber wie erkenne ich ob in der Zeile ein Umbruch ist?

Danke euch schon mal!

Edit: Wenn ich die Datei mit OpenOffice öffne, klappt das. OO erkennt das Problem anscheinend und behebt es. Im Notepad++ sieht mandie Misere hingegen
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    9,1 KB · Aufrufe: 23
Hi,
Wieso die IndexOutOfBounds-Exception auftritt kann aus den wenigen Code-Infos die du gepostet hast, nicht so genau ermittelt werden.
Ich mach mal eine Prognose: (muss aber nicht heissen, dass diese auch zutrifft, aber so ohne code wirds schwierig..)
Du iterierst über alle Zeilen von der csv-Datei . In etwa so:
Java:
while ((strLine = br.readLine()) != null)   {
   // nun mach was mit strLine ; splitt... etc.
}
Dann ermittelst du mit: .split("\",\""); die csv-werte, und machst damit dann etwas...
Hierbei kommt nun, dass ein Teil vom csv-Eintrag in Zeile 704 und wegen dem Zeilenumbruch in Zeile 705 weitergeht. Da du mit parts[5].replaceAll("\n", "").replaceAll("\r", "") den Zeilenumbruch behandeln möchtest, wird hier die IndexOutOfBounds-Exception auftreten, da die Zeile 704 nur 5 csv-Elemente ausgewertet werden. (0-4). Der Rest, d.h. die Zeile 705, der eigentlich auch zum Record der Zeile 704 gehört wird aber als neuer separater Record angesehen und somit hast du mit solchen Records Probleme.
Ich würde einen CSV-Parser von einer bereits bestehenden Librarray nehmen (z.B. https://commons.apache.org/proper/commons-csv/ oder http://opencsv.sourceforge.net/, etc... mit einer Suche nach java csv-parser findest du sicher etwas..) und mit damit die Records der csv-Datei einlesen.
Damit hast du zumindest mal complete Records. Das Problem mit dem Zeilenumbruch kannst du dann so beheben: (ein Beispiel mit commons csv)
Java:
fileReader = new FileReader(fileName);
csvFileParser = new CSVParser(fileReader, csvFileFormat);
List csvRecords = csvFileParser.getRecords();
String str;
for (int i = 1; i < csvRecords.size(); i++) {
    CSVRecord record = (CSVRecord) csvRecords.get(i);
    for (int j = 0; j < record.size(); j++) {
        str = record.get(j).replaceAll("\r\n", "");
        System.out.print(str + " ");
    }
    System.out.println();
}
und noch etwas... Wenn du Zeilenumbrüche entfernen möchtest, verwende:
Java:
STRING.replaceAll("\r", "").replaceAll("\n", "")
oder besser
Java:
STRING.replaceAll("\r\n", "")
und nicht:
Java:
STRING.replaceAll("\n", "").replaceAll("\r", "")
Da Windows Zeilenumbrüche mit "\r\n" bzw. UNIX Zeilenumbrüche mit "\n" macht..
 
Zuletzt bearbeitet:

Zurück
Oben