Почему возникает исключение при анализе данных из первого массива строк, но не при пропуске первого массива?
В моей системе есть программа для чтения 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()
.