2016-06-30 33 views
0

我是用java解析文本文件的新手段。我的任務是, 我有一個包含字符串和雙值如下(例如)的文本文件:使用掃描儀解析字符串和雙向量對?

字0.6478 1.74837 -0.2734 3.3475nextword 4.94756 -0.46372 3.29384 0.36475thirdword 5.92836(...)

(等等)

所以文件中包含的單詞後面跟着一致的數字,讓我們說n個數值,這些數值與他們關注的單詞有某種關聯。我最終想要的是一組字符串,其中包含文件中的所有單詞以及每個單詞的n個雙精度的相關矢量。

我的第一個想法是使用java.util.Scanner,但據我所知它只讀取由空格分隔的項目,正如您從我的示例中可以看到,組的最後一個數字和下一個詞。

那麼有沒有一種簡單的方法來解決這個問題,而使用掃描儀或更容易與一個不同的解析工具?

我任何提示

感謝

UPDATE:

我有另外一個問題。我的輸入文件包含指數數字,如:-2.1961e-05 我的掃描儀讀入的數字爲:-2.1961和單詞:e-05

是否有機會解決這些類型的數字?

+1

另一個問題值得另一個問題。提示:更多人正在觀察*新問題隊列,而不是編輯(*活動*)問題隊列,因此發佈新問題也會增加獲得答案的機會。無論如何,我更新了我的答案,以包括您在編輯中描述的情況。 – Pshemo

回答

0

是的,默認情況下,掃描儀僅使用空格(包括製表符和行分隔符)作爲分隔符。但是,如果你熟悉正則表達式(正則表達式),你可以將自己的分隔符設置爲:

  • 空格\s

或有

  • 位之前(?<=\d)
  • 的地方,之後沒有數字(?!\d)
  • 排除情況後數字是點.(因爲12.34a只有34a應該分開)(?![.])

(我在這裏使用正則表達式和負面先行機制。更多信息在:http://www.regular-expressions.info/lookaround.html

所以,你可以設置你的掃描器,如:

Scanner sc = new Scanner(yourData); 
sc.useLocale(Locale.ENGLISH);//some locales use 12,34 for double, English ensures 12.34 format 
sc.useDelimiter("\\s|(?<=\\d)(?!\\d)(?![.])"); 

RE UPDATE:

sc.useDelimiter("\\s|(?<=\\d)(?!\\d)(?![.]|[eE]-?\\d+)"); 
0

的一種方式(不包括掃描儀)是tokenise每一行用一個簡單的正則表達式,然後解析每個令牌:

String line = "word 0.6478 1.74837 -0.2734 3.3475nextword 4.94756 -0.46372 3.29384 0.36475thirdword 5.92836"; 
String nonNumeric = "[^\\d.-]"; 
//alternative: nonNumeric="[a-zA-Z\\s]" 
List<Double> doubles = Arrays 
    .asList(line.split(nonNumeric)) 
    .stream() 
    .filter(s -> !s.isEmpty()) 
    .map(s -> Double.parseDouble(s)) 
    .collect(Collectors.toList()); 
System.out.println(doubles); 

結果:

[0.6478, 1.74837, -0.2734, 3.3475, 4.94756, -0.46372, 3.29384, 0.36475, 5.92836]