为了账号安全,请及时绑定邮箱和手机立即绑定

从 CSV 文件读取时出现数字格式异常错误

从 CSV 文件读取时出现数字格式异常错误

翻阅古今 2022-09-28 16:33:36
我有以下csv文件:No_Reduction    No_Reduction    No_Reduction    No_Reduction1               15              1               90               7               0               03               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();转换列表方法: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;}请注意,如果我删除了第一行(包含的行),则错误将消失!No_Reduction我该如何解决这个问题?
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

让我们给出一个非答案:当你重新发明轮子时,这样的事情是可以预料到的。

含义:CSV解析比您想象的要难。通常,您自己的手写解析器适用于您可以想到的输入数据。第二次你从不同的来源向它抛出有效的CSV数据,稍微复杂一些,你的解析器就会崩溃。

所以:这个异常告诉你这个字符串不能被解析为数字,正如其他答案所解释的那样,这是由于其他元素的错误“解析”。" 1"

因此,我的建议是:如果你想有一个真正的CSV解析器,请使用现有的库,如openCSVapache共享资源CSV


查看完整回答
反对 回复 2022-09-28
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

看来你的是不正确的。空值和长度的参数和条件不正确。我想将该方法更改为:convertCSVtoArrayListsplit


    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;

}


查看完整回答
反对 回复 2022-09-28
?
守着一只汪

TA贡献1872条经验 获得超3个赞

它似乎试图将“不减少”行转换为整数,但失败了。代码是否进入您的 if(行.包含(“简化”))块?

也许添加这个只是作为测试

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

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


查看完整回答
反对 回复 2022-09-28
  • 3 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信