Einlesen der CSV-Datei in Java und das speichern der Werte in ein int array
Ich habe eine CSV-Datei von strings in diesem format:
14/10/2011 422 391.6592 394.52324 0.039215686
13/10/2011 408.43 391.7612 395.0686031 0.039215686
12/10/2011 402.19 391.834 395.3478736 0.039215686
Alles was ich will zu tun ist, Lesen Sie in der csv-Datei und speichern Sie dann die 3. und 4. Spalten Daten in integer-arrays.
Dies ist der code, den ich geschrieben habe:
BufferedReader CSVFile =
new BufferedReader(new FileReader("appleData.csv"));
String dataRow = CSVFile.readLine();
int count = 0;
while (dataRow != null){
String[] dataArray = dataRow.split(",");
EMA[count] = dataArray[2];
SMA[count] = dataArray[3];
dataRow = CSVFile.readLine(); //Read next line of data.
}
//Close the file once all data has been read.
CSVFile.close();
Möchte ich am Ende mit zwei arrays, EMA, das enthält alle Werte, die aus der 3. Spalte und SMA, die die Werte enthält, die aus der 4. Spalte.
Ich bin immer ein null-Zeiger-Ausnahme. Kann mir bitte jemand sagen, was für Fehler ich mache?
- Warum nicht, Sie zeigen nur den stacktrace? Wo kommt die NPE auftreten?
- Die NPE tritt in der Zeile, EMA[count] = dataArray[2];
- Und wo tun Sie initialisieren
EMA
? - EMA ist eine Globale variable initialisiert, so: int[] EMA;
- Das ist yust eine Erklärung. Müssen Sie initialisieren Sie das array mit der richtigen Größe (obwohl diese erhöhen sollten und IndexOutOfBounds statt einer NPE). Bitte zeigen Sie den code.
- Nein, es wirft eine NPE, da das array null ist. Es wirft eine IndexOutOfBoundsException, wenn das array initialisiert wurde, als
new int[0]
zum Beispiel. - Warum nicht OpenCSV?
- Warum sind Sie beim aufteilen einer tab-getrennten string mit einem Komma? Auch, wissen Sie, Sie könnten einfach anrufen
CSVReader.ready()
für Verfügbarkeit überprüfen, anstatt erstellen Sie die variable, die Sie nie Aufräumen? Du bist auch nicht Inkrementierencount
. - Nizet: Ups, das ist, was ich meinte... ich habe irgendwie geschafft den falschen Erklärung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Datei erscheint, verwenden Sie Leerzeichen/tab als Trennzeichen, aber Sie Spalten sich auf Kommas. Das macht für mich keinen Sinn.
Du davon ausgehen, dass die Daten, die Zeile hat eine bestimmte Länge, ohne es zu prüfen. Das macht für mich keinen Sinn.
Dieser code wird Ihnen zeigen, wie Sie es besser machen:
Hier ist der input-Datei, die ich verwendet, um es zu testen:
Hier ist die Ausgabe, die ich bekam:
[1] Es sollte ein count++ innerhalb der while-Schleife
[2] Sie haben nicht definiert/initialisiert die arrays EMA und SMA - verursachende Ausnahme.
[3] Wenn du split() durch ein Komma und ein Leerzeichen getrennt die Datei, das Ergebnis wird ein array mit der Einheit der Länge und der Indizes 2 und 3 mit erzeugen NullPointerException - auch wenn Sie das initialisieren der arrays richtig.
Ich schlage vor, Lesung in der Reihe, indem Sie in einer Liste (wie ArrayList oder Vector) in der Schleife, da Sie nicht wissen, die Größe im Voraus. Sobald Sie aus der Schleife, erstellen von 2 arrays der passenden Größe und copyInto() die Daten in den arrays. Lassen Sie den garbage collector deal mit den Vektoren.
Das problem mit deinem code ist, dass int[] EMA ist keine Initialisierung. Es ist nur definiert, dass die EMA ist ein array von Ganzzahlen, ohne effektiv erstellen (Sie müssen nur den Verweis).
Mein Rat wäre, das ändern der EMA und SMA ArrayLists und anstelle von Zuschreibungen, könnte man hinzufügen, die aktuellen Elemente der Listen.
Ende der Loop-Schleife die Anzahl der Elemente in jeder ArrayList mit der size () - Methode und können diese in arrays mit toArray-Methode, die Erfüllung welches Ziel Sie auch haben könnten.
Natürlich, ich gehe davon aus, dass du vergessen hast die Kommata in deinem Beispiel. Ansonsten sollten Sie die Trennzeichen für whitespace.