#ruby
#ruby
Вопрос:
У меня есть несколько текстовых файлов, необходимо извлечь первый экземпляр нескольких отдельных строк, несколько последовательных строк и некоторый текст между строками:
Документ 1
Заголовок документа
(TOD)Выпуск 3
Версия 2Авторы
Томас Э. Томас, Джон Л. Джон,
Фред А. Фред, Сандра К. СандраАдрес компании A
Другие авторы
Страница 3
Из этого примера мне нужен «Заголовок документа (TOD)», 3, 2 и весь текст между авторами и страницей 3, не включительно. Я медленно учусь, поэтому у меня есть несколько фрагментов кода, но они не заходят достаточно далеко. Я могу получить совпадение, но мне нужен первый экземпляр, а также экземпляр и следующая строка:
File.open("sample.txt").each do |line|
if line[/Document/]
puts line
Я пытался получить промежуточный текст, но это не совсем правильно:
File.open("sample.txt").each do |line|
while gets
print if [/Authors/../Page/]
end
Если вы чувствуете, что это слишком большая помощь, о которой нужно просить, я был бы признателен за подсказки / указатели.
Комментарии:
1. Не могли бы вы просто выводить строки, пока не нажмете на строку «Страница 3»?
2. Вам нужно использовать подход, основанный на состоянии. Следите за тем, в каком «состоянии» вы находитесь, и для каждой строки используйте
case
инструкцию, чтобы решить, что искать и что делать с тем, что вы найдете, и изменить переменную состояния на новое значение (возможно, символ), когда она видит что-то еще.
Ответ №1:
Вместо того, чтобы читать файл построчно, я думаю, было бы проще прочитать все целиком, а затем выполнить поиск по нему с помощью регулярного выражения. Что-то вроде:
File.open("sample.txt","r") do |f|
text = f.read
# everything between Document and Authors
m1 = text.match(/Document(.*)Authors/m)
# everything between Authors and Page
m2 = text.match(/Authors(.*)Page/m)
end
Комментарии:
1. Для этого вы захотите использовать модификатор
m
регулярных выражений (он.
сопоставляет символы новой строки).w
недопустимый параметр регулярных выражений в Ruby.