【问题标题】:Reading csv file resulting in number format exception读取 csv 文件导致数字格式异常
【发布时间】:2015-10-26 18:40:05
【问题描述】:

我正在使用 csvwriter 编写一个 csv 文件,然后调用它的方法 writeAll。写入后我正在使用缓冲读取器读取同一个文件,这导致数字格式异常。我该如何解决?

public static void writeInventoryToUpdate(List<String[]> data)throws IOException {

    String csv = "E:\\Semester 3\\PointOfSale2\\Inventory.csv";
    CSVWriter writer = new CSVWriter(new FileWriter(csv));

    writer.writeAll(data);
    writer.close();        
}


public void initInventory() throws FileNotFoundException, IOException {

    BufferedReader readInventory=new BufferedReader(new FileReader("E:\\Semester 3\\PointOfSale2\\Inventory.csv"));

    String line=readInventory.readLine();

    StringTokenizer nextItem;
    while(line!=null){
        nextItem=new StringTokenizer(line, ",");
        while(nextItem.hasMoreTokens()){
            int productID=Integer.parseInt(nextItem.nextToken()); //Exception occuring here
            int quantity=Integer.parseInt(nextItem.nextToken());
            Inventory inventory=new Inventory(productID, quantity);
            inStock.add(inventory);
            line=readInventory.readLine();
        }
    }
    readInventory.close();
}

【问题讨论】:

  • 通过编辑您的问题向我们展示代码和完整的堆栈跟踪,并在代码中标记问题所在的行。
  • 在您向我们展示您的 CSV 文件的格式或用于写入/读取它们的代码之前,我们确实无法为您提供太多帮助 - 您必须帮助我们帮助您
  • public static void writeInventoryToUpdate(List data)throws IOException{ String csv = "E:\\Semester 3\\PointOfSale2\\Inventory.csv"; CSVWriter writer = new CSVWriter(new FileWriter(csv)); writer.writeAll(数据); writer.close(); }
  • 还包括一个 csv 文件的示例,尽管堆栈跟踪应该向您显示异常发生在哪一行,这样您就可以看到它试图读取的字段。另请注意,csv 文件可以有标题,并且可以引用字段,这两者都不是你处理的。
  • 调试它? nextItem.nextToken() 是什么?在寻求帮助之前,您应该学习如何调试应用程序。

标签: java file csv


【解决方案1】:

您的代码大部分是正确的想法,但它的流程存在一些问题

BufferedReader readInventory=new BufferedReader(new FileReader("E:\\Semester 3\\PointOfSale2\\Inventory.csv"));

for(String line = readInventory.readLine(); line != null; line = readInventory.readLine())
{
    StringTokenizer nextItem = new StringTokenizer(line, ",");
    if(nextItem.countTokens() >= 2)
    {
        int productID = Integer.parseInt(nextItem.nextToken());
        int quantity = Integer.parseInt(nextItem.nextToken());
        Inventory inventory=new Inventory(productID, quantity);
        inStock.add(inventory);
    }
}
readInventory.close();

考虑到输入,这应该可以工作

12345,67890
15243,60798
3,6
77,12355678,123 //anything past the first two values are ignored
555
777,333 //and single value things are skipped

没有看到您尝试解析哪种 CSV 文件,我无法为您提供更好的解决方案

但是对于 CSV 文件的最基本形式(两个 int 值用逗号分隔),这应该可以正常工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多