【问题标题】:Importing two CSV files into Java and then parsing them. The first one works the second doesnt将两个 CSV 文件导入 Java,然后解析它们。第一个有效第二个无效
【发布时间】:2019-01-15 11:07:49
【问题描述】:

我正在处理我的代码,我正在导入两个 csv 文件然后解析它们

        //Importing CSV File for betreuen
        String filename = "betreuen_4.csv";
        File file = new File(filename);
        //Importing CSV File for lieferant
        String filename1 = "lieferant.csv";
        File file1 = new File(filename1);

然后我继续解析它们。对于第一个 csv 文件,一切正常。代码是

         try {
            Scanner inputStream = new Scanner(file);
            while(inputStream.hasNext()) {
                String data = inputStream.next();
                String[] values = data.split(",");
                int PInummer = Integer.parseInt(values[1]);
                String MNummer = values[0];
                String KundenID = values[2];
                //System.out.println(MNummer);
                //create the caring object with the required paramaters
                //Caring caring = new Caring(MNummer,PInummer,KundenID);
                //betreuen.add(caring);



            }
            inputStream.close();
        }catch(FileNotFoundException d) {
            d.printStackTrace();
          }

然后我继续解析代码所在的另一个 csv 文件

                // parsing csv file lieferant
             try {
                 Scanner inputStream1 = new Scanner(file1);
                 while(inputStream1.hasNext()) {
                 String data1 = inputStream1.next();
                 String[] values1 = data1.split(",");
                 int LIDnummer = Integer.parseInt(values1[0]);
                 String citynames = values1[1];
                 System.out.println(LIDnummer);
                 String firmanames = values1[2];

                //create the suppliers object with the required paramaters
                //Suppliers suppliers = new 
                //Suppliers(LIDnummer,citynames,firmanames);
                //lieferant.add(suppliers); 
            }

            inputStream1.close();
        }catch(FileNotFoundException d) {
            d.printStackTrace();
        }

我得到的第一个错误是

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 2 在 Verbindung.main(Verbindung.java:61)

所以我在第 61 行查看了我的数组 firmaname,我认为,它不可能超出范围,因为在我的 CSV 文件中有三列并且在索引 2(我知道是 CSV 文件中的第三列)是我的公司名称列表。我知道数组不是空的,因为当我写

       `System.out.println(firmanames)`

它将打印出前三个公司名称。因此,为了查看是否有其他原因导致问题,我将第 61 行注释掉,然后再次运行代码。我收到以下错误

   `Exception in thread "main" java.lang.NumberFormatException: For input 
  string: "Ridge"
  at java.lang.NumberFormatException.forInputString(Unknown Source)
  at java.lang.Integer.parseInt(Unknown Source)
  at java.lang.Integer.parseInt(Unknown Source)
  at Verbindung.main(Verbindung.java:58)`

我在谷歌上搜索了这些错误,你知道它是在说我试图将某些东西解析成一个不能是整数的整数,但我唯一想要解析成整数的是代码

      int LIDnummer = Integer.parseInt(values1[0]);

这确实是一个只包含整数的列。 我的第二列也确实只是美国城市名称的列。该列唯一的问题是某些城镇名称(如 Middle brook)中有空格,但我认为这不会导致 String 类型出现问题。在我的公司专栏中也有像 AT&T 这样的名称,但我认为 & 符号也不会导致字符串出现问题。我不知道我要去哪里错了。

我无法包含 csv 文件,但这是其中一部分的图片。每列的长度为 1000。 A pic of the csv file

【问题讨论】:

  • 如果有问题的 CVS 文件很短,您可以发布它,以便我们提供帮助。但最好的办法是使用调试。另一件事是编写我们自己的 CSV 解析器是个坏主意,因为如果 ',' 是值本身的一部分,而不是分隔符的一部分,您的代码不处理大小写。
  • 首先你得到的例外:它告诉你更多,它说你试图将“Ridge”解析成一个整数,这是不可能的。查看您的数据并搜索“Ridge”。他可能不小心出现在一个只有数字的列中。
  • @Sergey Prokofiev 我不知道如何包含 CSV 文件,但我包含了一张图片。我正在自己学习 Java,所以感谢您的建议,但在这一点上,我不明白为什么这不起作用,尽管它适用于其他 csv。
  • @moneydhaze 我看到 Ridge 来自我的 csv 的第二列,第一个条目的全名实际上是 Prairie Ridge。解析时csv文件中的空格会导致问题吗?
  • @user296098 图片是电子表格;这不会帮助我们调试您的解析代码。请将 csv 文件实际文本的第一行(例如 10 行)粘贴到您的问题中。

标签: java csv parsing


【解决方案1】:

默认情况下,扫描程序按空格 (docs) 拆分其输入。空白意味着空格、制表符和换行符。 所以我认为你的代码会在每个空格每个换行符处分割整个输入文件,这不是你想要的。

因此,您的代码将读取的前三个元素是

5416499,Prairie
Ridge,NIKE
1765368,Edison,Cartier

我建议使用方法readLine of BufferedReader 然后调用 split 。

另一种方法是明确告诉 Scanner 你希望它如何拆分输入

Scanner inputStream1 = new Scanner(file1).useDelimiter("\n");

但我认为这不是 Scanner 的最佳用途,因为可以使用更简单的类 (BufferedReader)。

【讨论】:

  • 感谢您的解释。确实,我摆脱了城市名称中的所有空白,然后一切正常。只是为了理解例如您发布的最后一行代码。如果我希望扫描仪用“,”(逗号)分割,那么我只写 Scanner inputStream1 = new Scanner(file1).useDelimiter(",");对不起,如果这个问题很愚蠢,但我正在自学 Java,我没有很大的基础可以继续学习,我必须边走边学
  • 您可以这样做,但它会以逗号分隔,因此您将得到带有换行符的“NIKE\n1765368”。您需要有useDelimiter("[,\n]") 才能拆分。但这将逐个字段返回数据,而不是逐行返回,因此例如前三个迭代将为您提供第一行的三个字段,依此类推。
【解决方案2】:

首先,我强烈建议您尝试使用现有的 CSV 解析器,例如 this one

但如果你真的想使用你自己的,你将需要做一些简单的调试。我不知道您的文件有多大,但是您描述的症状使我相信 csv 中的某处可能缺少逗号或意外的转义字符。你需要找出它是什么线。所以运行这段代码并在它崩溃之前检查它的输出:

     int line = 1;
try {
     Scanner inputStream1 = new Scanner(file1);

     while(inputStream1.hasNext()) {
         String data1 = inputStream1.next();
         String[] values1 = data1.split(",");
         int LIDnummer = Integer.parseInt(values1[0]);
         String citynames = values1[1];
         System.out.println(LIDnummer);
         String firmanames = values1[2];
         line++;
     }
} catch (ArrayIndexOutOfBoundsException e){
    System.err.println("The issue in the csv is at line:" + line);
}

一旦你找到它是什么线,答案应该是显而易见的。如果没有,请发布该行的图片,我们会看到...

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多