Почему возникает исключение при анализе данных из первого массива строк, но не при пропуске первого массива?

В моей системе есть программа для чтения Excel, которая также читает файлы csv.

Вот как я читаю файл csv:

        Path path = Paths.get(this.getFilePath());
        CSVParser parser = new CSVParserBuilder().withSeparator(';').build();

        try(BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8);
            CSVReader reader = new CSVReaderBuilder(br).withCSVParser(parser).build()) {

            rows = reader.readAll();

Это работает. Данные из файла csv хранятся в списке строковых массивов.

Теперь я заметил кое-что, читая данные из списка, чего я не понимаю.

Вот как я читаю данные из списка:

if (rows != null && rows.size() > 1) {
            for (String[] row : rows) {
                                    
                int i = Integer.parseInt(row[0]);
                String name = row[1];
                double d = Double.parseDouble(row[2].replace(",", "."));

            }
        }

Если первый массив выбирается из списка, а первая строка из массива анализируется от String до int, java.lang.NumberFormatException: для входной строки: выбрасывается " 27".

Но если первый массив (первая строка excel) пропущен:

            if (rows != null && rows.size() > 1) {
            for (int i = 1; i < rows.size(); i++) {  //i = 1, skipp first array(excel line)
                String[] row = rows.get(i);

                int i = Integer.parseInt(row[0]);
                String name = row[1];
                double d = Double.parseDouble(row[2].replace(",", "."));

            }
        }

Таким образом, исключение java.lang.NumberFormatException: For input string: не выбрасывается.

Я не понимаю, почему возникает исключение java.lang.NumberFormatException, если первый массив (строка excel) не пропущен.

Первая строка из файла Excel необходима, и ее нельзя пропускать. Может это как-то связано с чтением файла excel? С ридером пользуюсь?

Кто-нибудь знает эту проблему или может мне помочь?

3 ответа

Решение

Вы получаете эту ошибку, потому что перед вашим номером стоит пробел. Вы можете использоватьtrimперед разбором номера. Они должны удалить пустые поля и ошибку синтаксического анализа.

        if (rows != null && rows.size() > 1) {
        for (int i = 1; i < rows.size(); i++) {  //i = 1, skipp first array(excel line)
            String[] row = rows.get(i);

            int i = Integer.parseInt(row[0].trim());
            String name = row[1];
            double d = Double.parseDouble(row[2].replace(",", "."));

        }
    }

Вы также можете попробовать:

Integer.parseInt(row[0].replaceAll("\\D+", ""));

Это удаляет все не цифры из строки.

Ваш синтаксический анализ неадекватен. Полученная ошибка показывает, что одна ячейка содержит число с пробелом в начале.

java.lang.NumberFormatException: для входной строки: " 27"

Вы вызываете Integer.parseInt() для этого значения ячейки. Согласно документации parseInt() отклоняет ведущие пробелы.

Вам нужно будет обрезать значение перед вызовом parseInt. См. String.trim().

Строка, которую он пытается проанализировать, имеет начальный пробел: " 27". Вот что вызывает ошибку. Следующий код также вызывает исключение:

public class MyClass {
    public static void main(String args[]) {
      int i = Integer.parseInt(" 27");
      System.out.println(i);
    }
}

Как правило, вы должны дезинфицировать свой ввод перед его анализом. Например, если это будет числовое значение,trim() шнур перед подачей parseInt().

Другие вопросы по тегам