[英]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.