Ruby: положить несколько строк из файла - PullRequest
0 голосов
/ 02 октября 2018

Правильно, поэтому у меня есть файл, в котором я хочу получить две разные строки

text.txt:

abc
def
ghi
jkl
abc
ghi

Как мне прочитать и распечатать две строки?Я сейчас нахожусь здесь:

File.open(filename) do |f|
  f.each_line do |line|
    if line =~ /abc/ 
      puts "Current things: #{line}"
      end
   end
end

Я думал что-то вроде этого (что obv не работает, следовательно, вопрос)

File.open(filename) do |f|
  f.each_line do |line,line2|
    if line =~ /abc/ and line2 =~ /ghi/
      puts "Current things: #{line} #{line2}"
      end
   end
end

Я ВЫХОДУ на этом?

ожидаемый результат:

Current things: abc ghi

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Альтернативное, немного более короткое решение:

lines = File.foreach(filename, chomp: true).each_with_object([]) do |line, arr|
  arr << line if line.match?(/abc|ghi/)
end
puts "Current things: #{lines.join(' ')}" if lines.any?
# => Current things: abc ghi abc ghi

Если вы хотите уникальные строки:

require 'set'
lines = File.foreach(filename, chomp: true).each_with_object(Set.new) do |line, set|
  set.add(line) if line.match?(/abc|ghi/)
end
puts "Current things: #{lines.to_a.join(' ')}" if lines.any?
# => Current things: abc ghi
0 голосов
/ 02 октября 2018

Вы можете использовать массив для хранения совпадающих строк, а затем распечатать их после завершения итерации.

File.open(filename) do |f|
  matching_lines = []
  f.each_line do |line|
    if line =~ /abc/ || line =~ /ghi/
      matching_lines << line
    end
  end
  puts "Current things: #{matching_lines.join(' ')}" unless matching_lines.empty?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...