2017-01-25 4 views
2

Ich habe versucht, aus einer CSV-Datei zu lesen und ein Array von State-Objekten zu füllen, aber das Array wird nie über den ersten Index ([0]) gefüllt. Das Format der CSV-Datei ist wie folgt:Abrufen von Daten aus Datei in Array von Objekten (Java)

Mississippi,Jackson,MS,2991207,South,4 
New Hampshire,Concord,NH,1323459,New England,2 

wo jeder Datensatz durch eine neue Zeile getrennt ist.

inFile.useDelimiter(",|\n"); 
    String headerLine = inFile.nextLine(); 
    for(int i = 0; i<50; i++) { 
     while(inFile.hasNext()) { 
      State state = new State(inFile.next(), inFile.next(), inFile.next(), inFile.nextInt(), 
           inFile.next(), inFile.nextInt()); 
      stateArray[i] = state; 
     } 
    } 

Dies ist mein Code zum Auffüllen des Arrays von Staaten mit Elementen. Es verwendet einen Scanner namens inFile, um den CSV zu analysieren. Ich weiß nicht, wie ich das sonst tun soll. Ich habe mit print-Anweisungen getestet, und nur der erste Index des stateArray hat jemals Felder ausgefüllt.

gibt beispielsweise "Mississippi" zurück, aber jeder andere Index führt zu einer Nullzeigerausnahme.

Antwort

2

Sie haben eine while-Schleife innerhalb Ihrer for-Schleife. Die while-Schleife wird so lange ausgeführt, bis Sie die gesamte infile-Datei gelesen haben und zusätzlich den stateArray [0] -Index überschreiben.

Es gibt einige Möglichkeiten, diese Datei zeilenweise zu bearbeiten.

Eine Sache, die Sie tun können, ist zwei separate Scanner zu verwenden.

for (int i = 0; i < 50 && infile.hasNextLine(); i++) { 
    String line = infile.nextLine(); 
    Scanner stateLine = new Scanner(line); 
    stateLine.useDelimiter(","); 
    try { 
     stateArray[i] = new State(stateLine.next(), stateLine.next(), stateLine.next(), stateLine.nextInt(), stateLine .next(), stateLine.nextInt()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     // This is optional, just there so you can see why your input is throwing an error. 
    } 
    stateLine.close(); 
} 

Es gibt auch andere Lösungen zur Verfügung, als auch, möchten Sie vielleicht prüfen, ob Ihre Eingabe in das richtige Format zu sein, wird garantiert, oder wenn es variable Formate und Dateilängen sein kann.

+0

Dies ist völlig richtig, also stellen Sie die Antwort bitte als wahr! – Avoid

1

Vielleicht versuchen Sie, eine Bibliothek zu verwenden, um dies zu lesen, da Ihre Lösung fehlschlägt, wenn ein Wert ein Komma enthält (Sie werden es unabsichtlich in 2 teilen).

Hier ist meine Implementierung univocity-parsers mit:

Legen Sie ein paar @Parsed Anmerkungen in den Bereichen Ihrer State Klasse. Ich weiß nicht, was die Feldnamen sind, also habe ich nur die Attributnamen erfunden und jedem eine Position zugewiesen.

public class State { 
    @Parsed(index = 0) 
    String name; 
    @Parsed(index = 1) 
    String city; 
    @Parsed(index = 2) 
    String acronym; 
    @Parsed(index = 3) 
    String postcode; 
    @Parsed(index = 4) 
    String conty; 
    @Parsed(index = 5) 
    int id; 
} 

nun Ihre Datei in eine Liste von State Objekte zu analysieren, dies nur tun:

List<State> states = new CsvRoutines().parseAll(State.class, new File(inputFile), "UTF-8"); 

Hoffe, es hilft.

Disclosure: Ich bin der Autor dieser CSV-Parsing-Bibliothek. Es ist Open Source und kostenlos (Apache 2.0 Lizenz).

Verwandte Themen