当前位置: 首页 > 知识库问答 >
问题:

BufferedReader在从CSV读取并分配给不同类型时跳过字段

吕鸿朗
2023-03-14

写入从CSV文件读取值的方法。我对BufferedReader没有太多的经验。在我使用的测试文件中有4列和50行。它应该读入并分配给4个变量(String category、String name、int quantity、BigDecimal price),然后在我计算出读数后将这些变量传递给一个构造函数。我打印了这些值,看看我在哪里,但它们没有像预期的那样读入(见下文)。我想读两个字符串,然后是整数,最后是BigDecimal。它目前削减了一些字符和似乎跳过了其他,并没有打印新的行预期。

有谁能帮我弄明白是怎么回事吗?多谢了。

 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());
        }
     } 
}   

电流输出:

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

共有1个答案

寇涵容
2023-03-14

假设您的文件格式如下所示:

Name,Category,Qty,Price

我希望您使用FileReader.ReadLine()Line.Split,如下所示:

// 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());
   } 
}   

您得到“null”和“-1”的主要原因是因为最初的“for”循环没有意义:您试图读取50个项目,而不考虑实际文件中的内容。

我看不出有什么理由从“String”转换qty和price...但是如果需要,您可以轻松地使用Integer.ParseInt(String val)和BigInteger(String val)进行转换。

 类似资料:
  • 当我运行这段代码并且调用图确实很大时,程序会打印到输出的最后一行,并在处被阻塞,尽管没有任何剩余内容。有人知道问题出在哪里吗?将调用图发送到错误流。我尝试执行,这样我就可以从文件中读取,但它抱怨有太多的位置参数。 奇怪的是,对于小尺寸的调用图,代码运行得很好。

  • 因此,我正在阅读一个文件,其中包含我在前面代码中写到的约会。我想在文本文件中搜索某个日期的约会并将其添加到ArrayList中,但当BufferedReader遍历它时,它会跳过其他行...这是我的代码

  • 在我的班级中,我有一个属性: 并希望将其设置为: 设置此设置时,我会得到错误

  • 我试图分块读取输入流并写入文件以避免内存问题,我接收json格式的数据,并使用以下代码写入文件。 我的问题是,大多数json都写得很好,虽然其中一些包含损坏的数据,但我不确定我是否正确地将CharBuffer与BufferedReader一起使用,我观察到的另一件事是,对于少量数据,它正确地将CharBuffer写入文件,当我从服务器接收到更大的数据(大约2MB的输入流-不是很大)时,我通常会遇到

  • 这是一个类中的函数,允许你双击和单击手势。它在Swift 2.3中运行良好,但在转换到Swift 3后,它抛出了一些错误。我怎么也想不明白。我评论了它们发生的地方。