【问题标题】:Parse text- Scanner or BufferedReader?解析文本 - Scanner 还是 BufferedReader?
【发布时间】:2010-09-11 17:21:42
【问题描述】:

对于我的数据结构类,第一个项目需要解析歌曲的文本文件。

输入的一个例子是:
艺术家=“未知”
TITLE="摇滚宝贝"
LYRICS="树梢上的摇滚宝贝
风一吹,你的摇篮就会摇晃
当弓折断时,你的摇篮就会倒下
婴儿摇篮和所有东西都会下来
"

我想知道将艺术家、标题和歌词提取到 Song 类中各自的字符串字段的最佳方法。我的第一反应是使用 Scanner,取第一个字符,然后根据字母,使用 skip() 前进所需的字符并读取引号之间的文本。

如果我使用它,我将失去缓冲输入的能力。完整的歌曲文本文件有超过 422K 行文本。即使没有缓冲,扫描器也能处理这个问题吗?

【问题讨论】:

    标签: java parsing java.util.scanner buffering


    【解决方案1】:

    对于这样的事情,您可能应该只使用正则表达式。 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/ 并做好准备。这种努力所以非常值得花时间。

    【讨论】:

    • 正则表达式是解决方案。
    • 我也在研究正则表达式,它似乎确实符合我的需求。问题是,这将是我第一次使用它,而且它非常复杂。感谢您的链接。
    • 由于这只是一个数据结构课程,而且输入很简单,所以正则表达式可能是矫枉过正。
    • 我将其标记为已接受的答案,因为您提供了最好的解决方案,即使它是矫枉过正并且超出了我真正需要使用的范围。
    【解决方案2】:

    如果源数据可以使用一个标记向前解析,StreamTokenizer 可能是一种选择。这是一个 example 比较 StreamTokenizerScanner

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这也可以解决转义字符的问题(LYRICS 中的双引号。顺便说一下,还有其他 CSV 阅读器工具,我只是链接了我知道的那个(并且自己写的)。
      猜你喜欢
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2012-06-23
      • 2012-11-15
      • 2011-11-24
      相关资源
      最近更新 更多