2016-06-30 27 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]