在Java中将字符串解析为双精度时出错

在Java中将字符串解析为双精度时出错,java,Java,我正在尝试读取csv文件并将其字符串值转换为双精度 public void trq() throws IOException, ParseException { Test4 obj = new Test4(); String path = "transposedData1.csv"; BufferedReader readerBuffer = new BufferedReader(new FileReader(path)); String line; Li

我正在尝试读取csv文件并将其字符串值转换为双精度

public void trq() throws IOException, ParseException {
    Test4 obj = new Test4();
    String path = "transposedData1.csv";
    BufferedReader readerBuffer = new BufferedReader(new FileReader(path));
    String line;
    List<Double> results = new ArrayList<Double>();
    while ((line = readerBuffer.readLine()) != null) {
        if(!line.contains("NA")) {
            ArrayList<String> data_per_class = convertCSVtoArrayList11(line);

            List<Double> doubleList = data_per_class.stream()
                    .map(Double::parseDouble)
                    .collect(Collectors.toList()); // the error here

            // do other things
        }
    }
}

public static ArrayList<String> convertCSVtoArrayList11(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.0""
    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.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:482)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
    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:566)
    at Test4.trq(Test4.java:1063) \\ I mentioned that in the code above

您知道如何解决这个问题吗?

根据您看到的错误消息,该数字实际上被一对引号四舍五入,这可能导致呼叫失败


快速修复方法是使用
asString=substring(1,asString.length()-2)
,其中
asString
是要解析为double的字符串。

根据您可以看到的错误消息,该数字实际上被一对引号四舍五入,这可能会导致调用失败

快速修复方法是使用
asString=substring(1,asString.length()-2)
,其中
asString
是要解析为double的字符串。

替换

pathCSV.split("\\s*,\\s*");

这样数字就可以在空格上分开了。目前,它们是用额外的
存储到结果中的,例如
“1.0”
,应该存储为
“1.0”

替换

pathCSV.split("\\s*,\\s*");



因此,数字在空格上被拆分。目前,它们以额外的
存储到结果中,例如
“1.0”
,应存储为
“1.0”

使用
结果。添加(拆分数据[i].trim().replaceAll(“/”,”)
,然后返回使用
结果。添加(拆分数据[i].trim().replaceAll(“/”,”))
返回之前

文件可能包含带双引号的节。您提供的文件内容是否是此输出的实际文件内容?@Jason是的,它是实际文件。我检查了是否有双引号,但找不到。调试时是否检查了
splitData
?调试时间。查看抛出异常时的值。@AdamAmin-我希望解决方案对您有效。不要忘记接受答案,这样将来的访问者也可以自信地使用解决方案。检查以了解如何做。如果有任何疑问/问题,请随时发表评论。该文件可能包含带双引号的部分。您提供的文件内容是否是此输出的实际文件内容?@Jason是的,它是实际文件。我检查了是否有双引号,但找不到。调试时是否检查了
splitData
?调试时间。查看抛出异常时的值。@AdamAmin-我希望解决方案对您有效。不要忘记接受答案,这样将来的访问者也可以自信地使用解决方案。检查以了解如何做。如果有任何疑问/问题,请随时发表评论。正确的解决方案,+1。为什么会分裂?模式永远不会匹配。@PM77-1-我不明白你的意思。
字符串路径csv=“1.0 8.0 4.0 6.0”的输出;字符串[]splitData=pathCSV.split(\\s+);System.out.println(Arrays.toString(splitData))
[1.0,8.0,4.0,6.0]
@ArvindKumarAvinash-很抱歉我不清楚。我对你的解决方案没有问题。我指的是你对原始问题的分析。我仍然不明白额外的报价从何而来。正确的解决方案,+1。为什么它会分裂?模式永远不会匹配。@PM77-1-我不明白你的意思。
字符串路径csv=“1.0 8.0 4.0 6.0”的输出;字符串[]splitData=pathCSV.split(\\s+);System.out.println(Arrays.toString(splitData))
[1.0,8.0,4.0,6.0]
@ArvindKumarAvinash-很抱歉我不清楚。我对你的解决方案没有问题。我指的是你对原始问题的分析。我仍然不明白额外的报价从何而来。
pathCSV.split("\\s+");