Извлечение различных строк из файла с помощью ruby

#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.