Einlesen der CSV-Datei zeilenweise ein und analysieren es
Ich habe eine CSV Datei, die ich brauche, um zu Lesen, Zeile für Zeile mit Hilfe eines Scanner
und speichern nur Land-Namen in ein array von strings. Hier ist meine CSV-Datei:
World Development Indicators
Number of countries,4
Country Name,2005,2006,2007
Bangladesh,6.28776238,13.20573922,23.46762823
"Bahamas,The",69.21279415,75.37855087,109.340767
Brazil,46.31418452,53.11025849,63.67475185
Germany,94.55486999,102.2828888,115.1403608
Dies ist, was ich habe, so weit:
public String[] getCountryNames() throws IOException, FileNotFoundException{
String[] countryNames = new String[3];
int index = 0;
BufferedReader br = new BufferedReader(new FileReader(fileName));
br.readLine();
br.readLine();
br.readLine();
String line = br.readLine();
while((br.readLine() != null) && !line.isEmpty()){
String[] countries = line.split(",");
countryNames[index] = countries[0];
index++;
line = br.readLine();
}
System.out.println(Arrays.toString(countryNames));
return countryNames;
}
Ausgabe:
[Bangladesh, Brazil, null]
Für einige Grund, es überspringt die "Bahamas" und kann nicht Lesen, Deutschland. Bitte helfen Sie mir, habe ich fest an diese Methode für die Stunden schon. Vielen Dank für Ihre Zeit und Mühe. Die Rückgabe sollte ein array von Strings (Land name).
- Verwenden Sie eine geeignete parsing-Bibliothek, wie Apache Commons CSV oder OpenCSV
- Wann immer Sie anrufen
br.readline()
Sie sind effektiv eine neue Zeile Lesen. Es spielt keine Rolle, wenn Sie tun, es innerhalb oder außerhalb der Schleife oder einfach nur zum Vergleich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Probleme mit dem code für die Analyse dieser CSV-Datei. Ein paar Leute haben darauf hingewiesen, die Sie aufrufen
readLine
auf Ihre Leser zu viele Male, und verwirft den Ausgang. Jedes mal, wenn Sie aus dem stream gelesen, Sie verlieren den Zugriff auf alle Daten, bevor Sie die aktuelle lese-Punkt. Soreader.readLine() != null
, zum Beispiel, liest die neuen Daten aus dem stream, prüft, dass es nicht null ist, und bekommt dann sofort Los, da Sie noch nicht gespeichert sind, in eine variable. Das ist der wichtigste Grund, warum Sie sind, den Verlust von Daten während des Lesens.Das zweite Problem ist die split-Bedingung. Sie Spalten sich auf Kommas, das macht Sinn, da diese eine CSV-Datei, aber Ihre Daten enthält Kommas zu verwenden (zum Beispiel, "der Bahamas, Die"). Sie benötigen ein spezifischer split Zustand, wie beschrieben in dieser Beitrag.
Hier ist ein Beispiel, wie dies Aussehen könnte (unter Verwendung einer Liste für die
countryNames
anstelle von einem array, denn das ist viel einfacher, mit zu arbeiten):while
- Schleife und die Verwendung vonList
. Downvote für langsame bzw. unvollständige CSV-parsing. Keine Wahl, entweder Weg von mir.Scheint es, dass Sie Lesen, zu viele Linien, wie unten gesehen:
Die korrekte syntax für die
while
Schleife:Bemerken, wie
line
zugewiesen wird innerhalb der Bedingung statt innerhalb der Schleife.br.readLine();
vor der Schleife.