Ich habe ein Problem beim Auslesen einer CSV-Datei. Folgendes ist zu machen. Die CSV-Datei besteht aus 6 Feldern. Diese sind ID;Organisation;Land;Adresse;PLZ;Standplatz
Jede dieser Zeilen soll in ein Objekt abgespeichert werden.
Nun mein Problem. Mit split() teile ich die Zeilen in die entsprechenden Felder aufgeteilt. Nur wenn ich die Zeilen durchlaufe bekomme ich immer eine ArrayOutofBounds Exception. Das verwunderliche ist das das nicht immer in der gleichenZeile passiert. Ach noch zur Info. Die Zeilen in dem CSV-File sind nicht immer vollständig, dh. es sind felder leer.
Hier ist die MEthode die zum Auslesen der Zeilen und aufteilung ist.
Code:
public DBEntry[] getEntryArray() {
int lines = getLines();
DBEntry[] result = new DBEntry[lines];
FileInput fi = new FileInput(filename_);
for (String line; (line = fi.readLine()) != null; ) {
String[] sp = line.split(";");
for(int j = 0; j<sp.length; j++) {
if(sp[j] == "") {
sp[j] = "empty";
}
}
System.out.println(sp[0]); // Ausgabe ID
System.out.println(sp[1]); // Ausgabe Organisation
System.out.println(sp[2]); // Ausgabe Land
System.out.println(sp[3]); // Ausgabe Adresse
System.out.println(sp[4]); // Ausgabe zip
System.out.println(sp[5]); // Ausgabe Stand
System.out.println("---------------------------------------");
//System.out.println(line);
}
//System.out.println("Die Datei hat " + lines +" Zeilen");
return result;
}
Ich hoffe der Code reicht sonst melden und ich poste den gesamten Code.
package oopTask01;
/**
*
Title: OOP Task 01</p>
*
*
Description: Sort and Search</p>
*
*
Copyright: Copyright (c) 2006</p>
*
*
Company: Objectoriented Implementation of Algorithms and Data
* Structures</p>
*
* @author unbekannt
* @version 1.0
*/
// IMPORTE
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import oop.io.FileInput;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class DBReader {
private String filename_;
private ArrayList arrList = null;
/**
* Diese Klasse öffnet ein gewünschtes File und überprüft ob die Datei auch existiert.
* @param filename String
* @throws FileNotFoundException
*/
public DBReader(String filename) throws java.io.FileNotFoundException {
this.filename_ = filename;
FileInput fi;
fi = new FileInput(filename);
if (fi.getStatus() == 3) {
throw new FileNotFoundException();
}
fi.close();
}
/**
* Liest die Datendatei aus und erzeugt entsprechende DBEntry-Objekte
* @return DBEntry[]
*/
public DBEntry[] getEntryArray() {
int lines = getLines();
DBEntry[] result = new DBEntry[lines];
FileInput fi = new FileInput(filename_);
for (String line; (line = fi.readLine()) != null; ) {
String[] sp = line.split(";");
for(int j = 0; j<sp.length; j++) {
if(sp[j].equalsIgnoreCase("")) {
sp[j] = "empty";
}
}
System.out.println(sp[0]); // Ausgabe ID
System.out.println(sp[1]); // Ausgabe Organisation
System.out.println(sp[2]); // Ausgabe Land
System.out.println(sp[3]); // Ausgabe Adresse
System.out.println(sp[4]); // Ausgabe zip
System.out.println(sp[5]); // Ausgabe Stand
System.out.println("---------------------------------------");
//System.out.println(line);
}
//System.out.println("Die Datei hat " + lines +" Zeilen");
return result;
}
// Klasseninterne Methoden
/**
* Liefert die Anzahl der Zeilen der Datei zurück;
* @return int
*/
protected int getLines() {
int result = 0;
FileInput fi = new FileInput(filename_);
for (String line; (line = fi.readLine()) != null; result++) {
}
fi.close();
return result;
}
}
Fehlermeldung:
Code:
102
atelier 47
Deutschland
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at oopTask01.DBReader.getEntryArray(DBReader.java:70)
at oopTask01.ApplicationTask01.main(ApplicationTask01.java:23)
Wenn die Felder leer sind werden sie korrekt getrennt --> F1;F2;;F3;F4;;F6.
Die Fehlermeldung kommt bei dieser Zeile --> 102;atelier 47;Deutschland;;;
Wie kann ich solche Zeilen bei der bearbeitung ignorieren? Gibt es da eine Möglichkeit?
das problem ist das ich jeden einzelnen Wert einem Objekt zuordnen will und diese pro Zeile ein Objekt in ein Array packen will damit ich dann zum schluss sortieralgorithmen über dieses Array laufen lassen kann um die Objekte zu ordnen.
Hier werden die Daten der aufgeteilten Zeile benötigt. Deshalb funktioniert es mit einer for schleife nicht ganz. Das war auch der Grund warum ich jedes einzelne array element anzeigen hab lassen.
das problem ist das ich jeden einzelnen Wert einem Objekt zuordnen will und diese pro Zeile ein Objekt in ein Array packen will damit ich dann zum schluss sortieralgorithmen über dieses Array laufen lassen kann um die Objekte zu ordnen.
Hier werden die Daten der aufgeteilten Zeile benötigt. Deshalb funktioniert es mit einer for schleife nicht ganz. Das war auch der Grund warum ich jedes einzelne array element anzeigen hab lassen.
Du hast doch auch in der Schleife deinen Zähler, der dir sagt das wievielte Objekt du hast (if i == 0) .... oder n Switch-Case tuts auch. Wie gesagt hast du bei der Schleife den Vorteil, dass du schon mal nicht über das Array hinaus abfragen kannst.
Sollen die unvollständigen Sätze einfach ignoriert werden? Dann frag doch nach dem split die Länge ab:
Code:
for (String line; (line = fi.readLine()) != null; ) {
String[] sp = line.split(";");
if ( sp.length != 6) continue;
Wenn Du die Sätze aber verarbeiten willst, brauchst Du die Information, welche Fehler leer sind. In diesem Fall ist split() wohl nicht der richtige Ansatz.