繁体   English   中英

从CSV文件读取时出现NumberFormatException错误

[英]A NumberFormatException error when reading from CSV file

我有以下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解析器,请为此使用一个现有的库,例如openCSVapache commons CSV

似乎正在尝试将“不减少”行转换为整数,但失败了。 代码是否进入了if(line.contains(“ Reducation”))块?

也许将此添加为测试

if(line.contains("Reduction") || line.trim().isEmpty()) 

也许您的输入文件末尾有换行符?

似乎您的convertCSVtoArrayList不正确。 split参数和null和length条件不正确。 我想将该方法更改为:

    public static ArrayList<String> convertCSVtoArrayList(String pathCSV) {
    ArrayList<String> result = new ArrayList<>();
    if (pathCSV != null) {
        String[] splitData = pathCSV.split("\\s+");
        for (int i = 0; i < splitData.length; i++) {
            if (splitData[i].length() != 0) {
                result.add(splitData[i].trim());
            }
        }
    }
    return result;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM