将两个CSV文件导入Java,然后进行解析。第一个有效,第二个无效

时间:2019-01-15 11:07:50

标签: java csv parsing

我正在处理我的代码,其中我导入了两个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();
        }

我得到的第一个错误是

  

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

因此,我在第61行查看我的数组,即 namea ,我认为,它不可能超出范围,因为在我的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)`

我用谷歌搜索这些错误,您知道这是在说我试图将某些内容解析为一个不能为整数的Integer,但是我唯一要解析为Integer的是代码

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

实际上是仅包含整数的列。 我的第二列确实也只是美国的城市名称列。该列唯一的作用是在某些镇名(例如Middle brook)中有空格,但我认为这不会对String类型造成问题。在我公司的列中也有类似AT&T的名称,但我认为&符号也不会引起字符串问题。我不知道我要去哪里错了。

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

2 个答案:

答案 0 :(得分:1)

扫描仪默认情况下按空格(docs)分割其输入。空格表示空格,制表符和换行符。 因此,我认为您的代码将在每个空格每个换行符处分割整个输入文件,这不是您想要的。

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

5416499,Prairie
Ridge,NIKE
1765368,Edison,Cartier

我建议使用方法readLine of BufferedReader,然后在其上调用split。

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

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

但是我认为当一个简单的类(BufferedReader)可以使用Scanner时,这不是最好的选择。

答案 1 :(得分:0)

首先,我强烈建议您尝试使用现有的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);
}

找到行后,答案应该显而易见。如果没有,请发布该行的图片,我们将看到...