3

在我的系统中,我有一个 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: For input string: "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: 被抛出。

如果不跳过第一个数组(excel 行),我不明白为什么会抛出 java.lang.NumberFormatException。

excel 文件的第一行是必需的,不应跳过。它可以与读取excel文件有关吗?与我使用的阅读器?

有谁知道这个问题或有人可以帮助我吗?

4

3 回答 3

2

你得到这些错误,因为你的号码有一个前导空白。您可以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+", ""));

这将从字符串中删除所有非数字。

于 2020-08-21T13:13:22.063 回答
1

它试图解析的字符串有一个前导空格:“27”。这就是导致错误的原因。以下代码也会引发异常:

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

作为一般规则,您应该在解析输入之前对其进行清理。例如,如果它将是一个数值,trim()则在将其提供给parseInt().

于 2020-08-21T13:06:50.900 回答
1

您的解析不充分。您得到的错误表明一个单元格包含一个带有前导空格的数字。

java.lang.NumberFormatException:对于输入字符串:“27”

您在此单元格值上调用 Integer.parseInt() 。根据其文档, parseInt() 拒绝前导空格。

您需要在调用 parseInt 之前修剪该值。请参阅 String.trim()。

于 2020-08-21T13:09:23.370 回答