Java - 从包含double和int的文件中解析double

时间:2014-11-02 00:30:24

标签: java parsing vector

我在java中有以下方法,它读取数字文件(制表符分隔)并将数字放在双打矢量中

public static Vector<Double> getData(String path,int dataNum) throws Exception
{
    File file = new File(path);
    Scanner scan = new Scanner(file);
    scan.useDelimiter("\t");

    Vector<Double> content = new Vector<Double>();
    int limit = 0;

    while(scan.hasNext() && limit < dataNum)
    {
        content.add(Double.parseDouble(scan.next()));
        limit++;
    }

    return content;
}

这是我的示例文件

0   20000   -9.2149 1.6078  4.1023  0.0089185   0.0057066   0.015156

但是,当我运行代码时,我收到以下错误

Exception in thread "main" java.lang.NumberFormatException: For input string: "0
0"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222)
    at java.lang.Double.parseDouble(Double.java:510)
    at midterm.main.getData(main.java:91)
    at midterm.main.main(main.java:123)

我相信我的错误是我正在解析double但我的文件包含0和2000并且java将它们视为整数。但即使它们是整数,我也希望它们被视为双打而且仍然会进入我的载体。

2 个答案:

答案 0 :(得分:3)

  

这不是我文件的全部内容。它是一个165 MB的文件。很多行。但是每一行,数字都是分开的。

问题在于分隔符:您还需要允许\n成为分隔符:

scan.useDelimiter("[\t\n]");

否则,第一行的最后一个数字和第二行的第一个数字将组合成一个如下所示的字符串:"0\n0"并在不同的行上打印两个零,匹配错误你得到的消息。

Demo.

答案 1 :(得分:0)

而不是扫描仪,只需读取整行,将其拆分为“\ t”,然后使用“for-each”样式循环运行生成的String []?

import java.util.*;
public class Test {
  public static void main(String[] args) {
    String input = "0\t20000\t-9.2149\t1.6078\t4.1023\t0.0089185\t0.0057066\t0.015156";
    String[] columns = input.split("\t");
    Vector<Double> dv = new Vector<Double>();
    for(String s: columns) {
      dv.add(Double.parseDouble(s));
    }
    System.out.println(dv.toString());
  }
}

输出:

[0.0, 20000.0, -9.2149, 1.6078, 4.1023, 0.0089185, 0.0057066, 0.015156]