java - 从 CSV 文件读取时出现 NumberFormatException 错误
问题描述
我有以下 csv 文件:
No_Reduction No_Reduction No_Reduction No_Reduction
1 15 1 9
0 7 0 0
3 1 5 1
我想读取文件并计算每一行的总和。第一行是我在项目中使用的一些技术(忘记重复)。为此,我执行了以下操作:
BufferedReader readerBuffer = new BufferedReader(new FileReader("location"));
BufferedWriter bw = new BufferedWriter(new FileWriter("location",true));
while ((line = readerBuffer.readLine()) != null) {
if(line.contains("Reduction")) {
bw.write(convertCSVtoArrayList(line).get(0)); //I want to write the technique name in the new file
bw.write("\n");
}else if(!line.contains("NA")) {
ArrayList<String> data_per_class = convertCSVtoArrayList(line);
List<Double> doubleList = data_per_class.stream().map(Double::valueOf).collect(Collectors.toList()); //this is line 46
double sum = this.calculateSum(doubleList);
bw.write(sum);
bw.write("\n");
}
}
bw.close();
convertCSVtoArrayList 方法:
public static ArrayList<String> convertCSVtoArrayList(String pathCSV) {
ArrayList<String> result = new ArrayList<String>();
if (pathCSV != null) {
String[] splitData = pathCSV.split("\\s*,\\s*");
for (int i = 0; i < splitData.length; i++) {
if (!(splitData[i] == null) || !(splitData[i].length() == 0)) {
result.add(splitData[i].trim());
}
}
}
return result;
}
基本上,错误是:
Exception in thread "main" java.lang.NumberFormatException: For input string: "" 1""
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at java.lang.Double.valueOf(Double.java:502)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at MockerClass.applyForCase(MockerClass.java:46)
at MockerClass.main(MockerClass.java:16)
请注意,如果我删除第一行(包含 的行No_Reduction
),错误就会消失!
我该如何解决这个问题?
解决方案
让我们给出一个非答案:当你重新发明轮子时,这些事情是可以预料的。
含义:CSV 解析比你想象的要难。通常,您自己的手写解析器适用于您可以想到的输入数据。第二次你从不同的来源向它抛出有效的 CSV 数据,稍微复杂一点,你的解析器就会中断。
所以:那个异常告诉你这个字符串" 1"
不能被解析为数字,正如其他答案所解释的那样,这是由于其他元素的错误“解析”。
因此,我的建议是:如果您想拥有一个真正的 CSV 解析器,请为此使用现有的库,例如openCSV或apache commons CSV。
推荐阅读
- sql - Replace 00 with varbinary type
- gtk - GtkApplicationWindow 子类“销毁”两次
- php - PHP替换动态变量
- angularjs-directive - ng-selected 所需的验证不适用于复选框
- mysql - 使用左连接和分组方式重命名查询中的重复结果
- azure - 在 Azure 中的 dockerised App Service 上运行“安装”命令
- regex - 为什么匹配对象 .Value 没有按预期工作?
- php - 通过 php 处理并发 puppeteer 请求
- angular - Angular 4:在表单中添加/删除动态输入字段
- java - Sort stream of objects and get first and print out