2016-04-12 7 views
0

Schreiben einer Methode zum Einlesen von Werten aus einer CSV-Datei. Ich habe nicht viel Erfahrung mit BufferedReader. 4 Spalten und 50 Zeilen in der Testdatei, die ich verwende. Es soll einlesen und 4 Variablen zuweisen (String-Kategorie, String-Name, Int-Menge, BigDecimal-Preis) und mit der Absicht, diese später später an einen Konstruktor zu übergeben. Ich habe die Werte ausgedruckt, um zu sehen, wo ich bin, und sie lesen nicht wie erwartet ein (siehe unten). Ich möchte die beiden Strings einlesen, dann die ganze Zahl und schließlich die große Zahl. Es zerhackt derzeit einige Zeichen und scheint andere zu überspringen und die neue Zeile nicht wie erwartet zu drucken.BufferedReader Überspringen von Feldern beim Lesen von CSV und Zuweisen zu verschiedenen Typen

Kann mir jemand helfen zu verstehen, was vor sich geht? Vielen Dank.

Warum werden die -1- und Nullwerte auch unten gedruckt? Seile ich die Datei nach der 50. Zeile nicht korrekt?

public static void readFromFile(){ 
    BufferedReader fileReader = null; 
    String csvFile = "/Users/Acer/Documents/CS1400/Assignments/InventoryApp/inventory.csv"; 
    int fileSize = 50; //input.nextInt;    

    try { 
     fileReader = new BufferedReader(new FileReader(csvFile)); 
     for (int i = 0; i < fileSize; i++){ 
      String category = fileReader.readLine();          
      String name = fileReader.readLine();     
      int quantity = fileReader.read();    
      BigDecimal price = new BigDecimal(fileReader.read());    
      System.out.println(category + " " + name + " " + quantity + " " + price);          
     }   
    } 
    catch (IOException ioe) { 
     System.out.println(ioe.getMessage()); 
    } finally { 
     try { 
     fileReader.close(); 
     } 
     catch (IOException ioe) { 
       System.out.println(ioe.getMessage()); 
     } 
    } 
} 

Stromausgang:

Golf,Bag,7,49.99 Baseball,Baseball,4,12.99 72 111 
ckey,Puck,8,11.99 Basketball,Basketball,2,15 70 111 
otball,Football,7,13.95 Soccer,Ball,6,20.99 71 111 
lf,Putter,2,65.5 Baseball,Catchers Mitt,9,49.99 72 111 
ckey,Stick,2,27.99 Basketball,Shorts,4,20 70 111 
otball,Shoulder Pads,8,34.99 Soccer,Goal,2,44.99 71 111 
lf,Tees,4,2.99 Baseball,Cleats,8,50 72 111 
ckey,Skates,3,69.99 Basketball,Hoop,5,99.99 70 111 
otball,Cleats,2,67.99 Soccer,Shin Guards,4,35.95 71 111 
lf,Balls,8,20 Baseball,Pants,5,34.98 72 111 
ckey,Gear Bag,3,30 Basketball,Jersey,5,24.99 70 111 
otball,Jersey,3,24.99 Soccer,Cleats,6,56.99 71 111 
lf,Driver,8,99.99 Baseball,Bat Bag,9,40 72 111 
ckey,Goal,9,30 Basketball,Socks,5,20 70 111 
otball,Cup,9,12.95 Soccer,Socks,5,12 71 111 
lf,3 Wood,2,80.99 Baseball,Socks,3,12.99 72 111 
ckey,Neck Guard,2,1.99 Basketball,Catchers Mask,2,32.95 70 111 
otball,Cup,7,12 Soccer,Cones,9,11.99 71 111 
lf,Irons,3,99.99 Baseball,Sunglasses,6,50 72 111 
ckey,Helmet,5,23 Basketball,Shoes,3,74.95 70 111 
otball,Helmet,1,13.99 Soccer,Goalie Gloves,8,14.99 71 111 
lf,Wedge,2,50 Baseball,Batting Helmet,5,27.99 72 111 
ckey,Cup,8,20 Basketball,Sleeves,4,13 70 111 
otball,Gloves,6,20.95 Soccer,Jersey,7,30.99 71 111 
lf,Cart,5,66.99 Baseball,Bat,6,50.99 -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
null null -1 -1 
+0

Es gibt [viele vorhandene Bibliotheken] (http://stackoverflow.com/questions/200609/can-you-recommend-a-java-library-for-reading-and-possibly-writing-csv-files) Das wird CSV für Sie analysieren. Warum nicht eines davon benutzen? – dnault

+0

dnault - Ehrlich gesagt, bin ich neu genug, um Java zu benutzen, um andere Bibliotheken zu benutzen. Ich habe die .jar-Datei heruntergeladen. Wird es nach einem Doppelklick automatisch installiert? Muss ich die Klasse importieren? – cobes

+0

Ja, Sie müssen die Klasse importieren. Sie müssen die JAR auch zum Klassenpfad hinzufügen, wenn Sie Ihren Code kompilieren, und zur Laufzeit.Wenn Sie daran interessiert sind, mehr zu lernen, könnten Sie mit googlen "add jar to class path" beginnen. – dnault

Antwort

0

fileReader.readLine() liest eine Zeile, die von all den Attributen 4 besteht.

In jeder Iteration lesen Sie nur eine Zeile mit String str = fileReader.readLine() und dann teilen Sie diese Zeile mit String[] splited = str.split(","); und rufen Sie Ihren Konstruktor danach.

String str; 
while ((str = fileReader.readLine()) != null) {  
    String[] splited = str.split(",");  
    String category = splited[0]; 
    String name = splited[1]; 
    int quantity = Integer.parseInt(splited[2]); 
    BigDecimal price = new BigDecimal(Integer.parseInt(splited[3]));           
} 

Auch ist es eine bessere Idee, eine Bibliothek wie OpenCSV zu verwenden, die Ihr Programm viel robuster machen.

0

Jedes Mal, wenn Sie eine fileReader.readLine() ausführen, versuchen Sie, eine ganze Zeile und nicht nur einen Slot zu lesen. Sie sollten Ihre Datei wie folgt lesen:

String line = null; 
while ((line = fileReader.readLine()) != null) { 
    String[] slots = line.split(SEPARATOR); 
    String category = slots[0]; 
    String name = slots[1]; 
    int quantity = Integer.parseInt(slots[2]); 
    BigDecimal price = new BigDecimal(slots[3]); 
    System.out.println(category + " " + name + " " + quantity + " " + price); 
} 

Beachten Sie, dass die Anzahl der Zeilen nicht angegeben werden muss. Außerdem sollten Sie SEPARATOR durch das Trennzeichen ersetzen, das in Ihrer CSV-Datei verwendet wird.

2

Angenommen, Ihr Dateiformat wie folgt aussieht:

Name,Category,Qty,Price 

Ich möchte Sie bitten fileReader.readLine() und line.split wie folgt zu verwenden:

// String csvFile = "/Users/Acer/Documents/CS1400/Assignments/InventoryApp/inventory.csv"; 
public static void readFromFile(String fname){ 
    BufferedReader fileReader = null; 
    String line 
    try { 
    fileReader = new BufferedReader(new FileReader(csvFile)); 
    while ((line = fileReader .readLine()) != null) { 
     String data[] = line.split(","); 
     String name = data[0]; 
     String category = data[1]; 
     String quantity = data[2]; 
     String price = data[3]; 
     System.out.println(category + " " + name + " " + quantity + " " + price);          
    } 
    fileReader.close();   
    } 
    catch (IOException ioe) { 
    System.out.println(ioe.getMessage()); 
    } 
} 

Der Hauptgrund Sie die „null sind immer "und" -1 "ist, weil die ursprüngliche" for "-Schleife bedeutungslos war: Sie haben versucht, 50 Elemente unabhängig davon zu lesen, was in der eigentlichen Datei war.

Ich habe keinen Grund gesehen, Menge und Preis von "String" zu übersetzen ... aber Sie könnten Integer.parseInt(String val) und BigInteger(String val) einfach verwenden, um die Konvertierung durchzuführen, wenn Sie wollten.

Verwandte Themen