2014-11-02 59 views
1

我已經在Java以下的方法,其讀取數字(製表符分隔)的一個文件,並把該號碼在雙打的向量爪哇 - 解析從文件含有雙雙和int

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將它們視爲整數。但即使他們是整數,我希望他們被視爲雙打,並仍然進入我的載體。

+1

點泛型:使用'矢量含量=新向量();'。這不是一個答案,但是如果你使用泛型,你應該這樣做。 – 2014-11-02 00:32:39

+0

感謝您的回覆。我確實做了你所說的改變...但是,它仍然給我同樣的錯誤 – Masster 2014-11-02 00:33:46

+0

如果選項卡分隔每個數字,我無法重現您的問題。 – 2014-11-02 00:34:00

回答

3

這不是我的文件的全部內容。這是一個165 MB的文件。很多線。但每行,數字都是製表符分隔的。

問題是分隔符,然後:你需要允許\n是一個分隔符,以及:

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

否則,第一行的最後一個數字,並從第二行的第一個數字會拼成一個單獨的字符串,如下所示:"0\n0"並在不同的行上打印出兩個零,並匹配您獲得的錯誤消息。

Demo.

+0

+1用於解釋什麼是(很可能)正在進行。不過,我會考慮其他答案(逐行閱讀,拆分和解析)一種更簡潔的方法。 – 5gon12eder 2014-11-02 00:47:07

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] 
+0

感謝您的回覆。我覺得我有點不清楚。這是我分享的SAMPLE文件。實際的文件是165MB,並有數千行。但是每行的數字都是製表符分隔的 – Masster 2014-11-02 00:38:34

+1

是的,很明顯,這就是爲什麼您使用單行硬編碼進行測試的原因。那樣有用嗎?大!找出哪些線路出了問題,因爲這個錯誤不是與你的代碼有關,而是與你的數據有關。 – 2014-11-02 00:44:12