簡體   English   中英

為什么從第一個字符串數組解析數據時會拋出異常,而在跳過第一個數組時不會拋出異常?

[英]Why is an exception thrown on parsing data from the first string array but not when skipping the first array?

在我的系統中,我有一個 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 文件的數據存儲在字符串 arrays 的列表中。

現在,當我從列表中讀取我不理解的數據時,我注意到了一些事情。

這是我從列表中讀取數據的方式:

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文件有關系嗎? 配合我用的閱讀器?

有誰知道這個問題或者誰能幫助我?

你得到這些錯誤,因為你的號碼有一個前導空白。 您可以在解析數字之前使用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+", ""));

這從字符串中刪除所有非數字。

它試圖解析的字符串有一個前導空格:“27”。 這就是導致錯誤的原因。 下面的代碼也會拋出異常:

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

作為一般規則,您應該在解析輸入之前對其進行清理。 例如,如果它是一個數字值,則在將它提供給parseInt()之前trim()該字符串。

您的解析不充分。 您得到的錯誤表明一個單元格包含一個帶前導空格的數字。

java.lang.NumberFormatException:對於輸入字符串:“27”

您對此單元格值調用 Integer.parseInt()。 根據其文檔, parseInt() 拒絕前導空格。

您需要在調用 parseInt 之前修剪該值。 請參見 String.trim()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM