Разбор текста - сканер или BufferedReader? - PullRequest
1 голос
/ 11 сентября 2010

Для моего класса структур данных первый проект требует, чтобы текстовый файл песен был проанализирован.

Пример ввода:
ARTIST = "неизвестно"
TITLE = "Rockabye Baby"
LYRICS = "Малышка Rockabye на верхушках деревьев
Когда дует ветер, ваша колыбель будет качаться
Когда сломается лук, ваша колыбель упадет
Вниз придет детская колыбель и все
«

Мне интересно, как лучше всего извлечь Artist, Title и Lyrics в соответствующие им строковые поля в классе Song. Моя первая реакция заключалась в том, чтобы использовать сканер, взять первый символ и, основываясь на букве, использовать skip () для перехода к нужным символам и чтения текста между кавычками.

Если я использую это, я проигрываю при буферизации ввода. Полный текстовый файл песни содержит более 422 тыс. Строк текста. Может ли сканер справиться с этим даже без буферизации?

Ответы [ 3 ]

3 голосов
/ 11 сентября 2010

Для чего-то подобного вам, вероятно, следует просто использовать регулярные выражения. Класс Matcher поддерживает буферизованный ввод.

Метод find принимает смещение, поэтому вы можете просто анализировать их при каждом смещении.

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

Regex - это целый мир в себе. Если вы никогда не использовали их раньше, начните здесь http://download.oracle.com/javase/tutorial/essential/regex/ и будьте готовы. Усилие , поэтому очень стоит затраченного времени.

1 голос
/ 12 сентября 2010

В этом случае вы можете использовать CSV-ридер с разделителем полей '=' и разделителем полей '' '(двойная кавычка). Это не идеально, так как вы получаете одну строку для ARTIST , Название и лирика.

1 голос
/ 12 сентября 2010

Если исходные данные могут быть проанализированы с использованием одного маркера, можно выбрать StreamTokenizer.Вот пример , который сравнивает StreamTokenizer и Scanner.

...