2010-09-11 127 views
1

对于我的数据结构类,第一个项目需要解析歌曲的文本文件。解析文本 - 扫描仪或BufferedReader?

输入的一个例子是:
ARTIST =“未知”
TITLE =“Rockabye宝贝”
歌词=“Rockabye宝宝在树梢
当风儿吹起你的摇篮摇
当弓伤了你的摇篮也就掉
下会婴儿摇篮和所有

我想知道的艺术家,标题和歌词提取歌曲中的类各自的字符串字段的最佳途径。我的第一反应是使用扫描仪,取第一个字符,并根据字母使用skip()提前输入所需字符并读取引号之间的文本。

如果我使用这个,我会失去缓冲输入。完整的歌曲文本文件有超过422K行文字。即使没有缓冲,扫描仪是否可以处理这个问题?

回答

3

对于这样的事情,你应该使用正则表达式。 Matcher类支持缓冲输入。

find方法需要一个偏移量,所以你可以在每个偏移量处解析它们。

http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.html

正则表达式是整个世界变成自己。如果你以前从未使用过它们,请从这里开始http://download.oracle.com/javase/tutorial/essential/regex/并做好准备。努力是所以非常值得所需的时间。

+0

正则表达式是解决方案 – mhshams 2010-09-11 17:32:19

+0

我正在研究正则表达式,它看起来符合我的需求,事情是,这将是我第一次使用这个&它非常复杂,谢谢你的链接 – Jason 2010-09-11 20:16:35

+0

因为这只是一个数据结构课程,输入很简单,所以正则表达式可能是过量的。 – MAK 2010-09-11 20:47:37

1

如果源数据可以使用一个令牌进行解析,那么StreamTokenizer可能是一个选择。这是一个example比较StreamTokenizerScanner

1

在这种情况下,您可以使用CSV reader,字段分隔符'='和字段分隔符'''(双引号)。它不完美,因为您为ARTIST,TITLE和LYRICS获取一行。

+0

这也会解决转义字符的问题(LYRICS中的双引号)。顺便说一下,还有其他的CSV阅读器工具,我只是链接了我所知道的(并且自己写的)。 – 2010-09-12 06:29:59