Ruby: Как избирательно удалить обертывание линии из текстового файла?

StackOverflow https://stackoverflow.com/questions/1913897

  •  19-09-2019
  •  | 
  •  

Вопрос

Я хочу отредактировать следующий текст, чтобы каждая строка начиналась с дилера:. Это означает, что нет перерывов обертывания/линии. Для линий, начиная с системы, обертывание в порядке.

Как будет выглядеть решение в Ruby? Спасибо

Это расположена в файле .txt

Дилер: 5 секунд осталось действовать
Дилер: Hitman2714 выигрывает горшок (9)
Дилер: Рука № 1684326626D
Дилер: Guitou699 осталось 5 секунд
действовать
Дилер: Guit699
Дилер: у Бадж Хасана осталось 5 секунд
действовать
Дилер: Бадж Хасан истекло
Дилер: Hitman2714 осталось 5 секунд
играть
Дилер: Hitman2714
Система: ночная гарантия $ 10 000
начнется через 20 минут
Дилер: Дилер: Рука № 1684326626D
Дилер: перспективные публикуют большие
слепой 25

Желаемый вывод:

Дилер: 5 секунд осталось действовать
Дилер: Hitman2714 выигрывает горшок (9)
Дилер: Рука № 1684326626D
Дилер: Guitou699 осталось 5 секунд, чтобы действовать
Дилер: Guit699
Дилер: у Бадж Хасана осталось 5 секунд, чтобы действовать
Дилер: Бадж Хасан истекло
Дилер: Hitman2714 осталось 5 секунд, чтобы действовать
Дилер: Hitman2714
Система: ночная гарантия $ 10 000
начнется через 20 минут
Дилер: Дилер: Рука № 1684326626D
Дилер: Перспекстичный публикует большой слепой 25

Это было полезно?

Решение

remove_newline = false

ARGF.each_line do |line|
    if line =~ /^(Dealer|System): /
        puts if remove_newline
        remove_newline = ($1 == 'Dealer')
    end
    line.sub!(/\n/, ' ') if remove_newline
    print line
end

Если вы не против устранить упаковку на строках «системы», и если файл достаточно мал, вы можете сделать что -то вроде этого:

puts ARGF.readlines.join('').gsub(/\n(?!Dealer: |System: )/, ' ')

Другие советы

previous = ''

ARGF.each_with_index do |line, i|
  line.chomp!
  unless i == 0
    if line =~ /^Dealer/ || line =~ /^System/
      puts previous
      previous = line
    else
      previous << (previous =~ /^System/ ? "\n" : " ") << line
    end
  else
    previous = line
  end
end
puts previous

Использует Stdin и Stdout для ввода и вывода.

content.gsub(/^(.*)\n(?!(Dealer|System|\Z))/, '\1 ')

грип

Зачем использовать Ruby, если этот вид инструмента уже существует

cat oldfile | grep ^Dealer: > newfile

Рубин

Если это должно быть частью более крупного применения Ruby, то нет ничего плохого в том, чтобы сделать это в Ruby.

content= File.read(oldfile)
content= content.grep(/^Dealer:/)
File.open(newfile, "w") { |f| f.write(content) }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top