Я хотел бы сделать это следующим образом:
lines = []
File.foreach('./test.txt') do |li|
lines << li if (li[/^\*{5}/] ... li[/^\*{5}/])
end
lines[1..-2].map(&:strip).select{ |l| l > '' }
# => ["useful1 text", "useful3 text"]
/^\*{5}/
означает «Строка, которая начинается с и имеет, по меньшей мере, пять„*
“
...
является одним из двух видов использования ..
и ...
. и, в этом использовании, обычно называют оператором «триггера». Он часто не используется в Ruby, потому что большинство людей, похоже, не понимают его. Иногда ошибочно принимают разделители Range ..
и ...
.
В этом использовании, Ruby часы для первого теста, li[/^\*{5}/]
, чтобы вернуть true. Как только это произойдет, ..
или ...
вернет true, пока второе условие не вернет true. В этом случае мы ищем один и тот же разделитель, поэтому один и тот же тест будет работать, li[/^\*{5}/]
, и именно здесь вступает в игру разница между двумя версиями: ..
и ...
.
..
вернет тумблер обратно в ложь немедленно, в то время как ...
будет ждать, чтобы посмотреть на следующей строке, что исключает проблему из первых видя разделитель, а затем второй, видя ту же линию и запуск.
Это позволяет тест назначить lines
, который до [1..-2].map(&:strip).select{ |l| l > '' }
выглядит как:
# => ["*********************\n",
# "\n",
# "useful1 text\n",
# "\n",
# "useful3 text\n",
# "\n",
# "*********************\n"]
[1..-2].map(&:strip).select{ |l| l > '' }
очищает, что до нарезки массива, чтобы удалить первые и последние элементы, strip
удаляет начальные и конечные пробела , эффективно избавляясь от завершающих строк новой строки и вызывая пустые строки и строки, содержащие нужный текст. select{ |l| l > '' }
берет линии, которые больше, чем «пустые» строки, т. Е. Не пустые.
См. «When would a Ruby flip-flop be useful?» и связанные с ним вопросы, а также «What is a flip-flop operator?» для получения дополнительной информации и некоторого фона. (Программисты Perl используют ..
и ...
часто для этой цели.)
Одно предупреждение: если файл имеет несколько блоков, разделенных таким образом, вы получите их содержимое. Код, который я написал, не знает, как остановиться, пока не будет достигнут конец файла, поэтому вам нужно будет выяснить, как справиться с этой ситуацией, если это может произойти.
Я получаю содержимое как этот контент = File.open ("somefilename.txt"). Это дает мне ошибку неопределенного разделения метода. Каков правильный способ получить контент. – user1788294
'File.read (...)' также выполнит эту работу. Если вы получаете неопределенный метод, возможно, вы ничего не получите для «контента»? – tadman
Я проверил содержимое не пустым. Кажется, что-то здесь отсутствует. – user1788294