Импорт двух файлов CSV в Java и последующий их анализ. Первый работает второй нет - PullRequest
0 голосов
/ 15 января 2019

Я работаю над своим кодом, где я импортирую два 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)

Итак, я смотрю на свой массив, который firmaname , в строке 61, и я думаю, что невозможно выйти за пределы диапазона, поскольку в моем файле 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]);

Это действительно столбец, содержащий только целые числа. Моя вторая колонка - это действительно просто колонка с названиями городов в США. Единственное, что есть в этом столбце, это то, что в названиях некоторых городов, таких как Мидл-Брук, есть пробелы, но я не думаю, что это вызовет проблемы для типа String. Также в столбцах моей компании есть такие имена, как AT & T, но я думаю, что символ & также не вызовет проблем для строки. Я не знаю, где я иду не так здесь.

Я не могу включить CSV-файл, но вот его часть. Длина каждого столбца 1000. Изображение файла CSV

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Сканер по умолчанию разделяет свой ввод по пробелам ( docs ). Пробел означает пробел, табуляцию и перевод строки. Таким образом, ваш код, я думаю, разделит весь входной файл на каждый пробел и на каждой новой строке, а это не то, что вам нужно.

Итак, первые три элемента, которые будет читать ваш код:

5416499,Prairie
Ridge,NIKE
1765368,Edison,Cartier

Я предлагаю использовать метод readLine из BufferedReader , затем вызывать split для этого.

Альтернативой является явное указание сканеру, как вы хотите разделить входные данные

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

но я думаю, что это не лучшее использование Scanner, когда подойдет более простой класс (BufferedReader).

0 голосов
/ 15 января 2019

Прежде всего, я настоятельно рекомендую вам попробовать использовать существующий синтаксический анализатор CSV, например this .

Но если вы действительно хотите использовать свой собственный, вам нужно будет сделать несколько простых отладок. Я не знаю, насколько велик ваш файл, но описываемые вами симптомы наводят меня на мысль, что где-то в 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);
}

Как только вы найдете, какая это строка, ответ должен быть очевидным. Если нет, опубликуйте картинку этой строки, и мы увидим ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...