Ruby: Как мне выборочно удалить перенос строки из текстового файла? - PullRequest
1 голос
/ 16 декабря 2009

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

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

Это находится в текстовом файле.

Дилер: 5 секунд осталось действовать
Дилер: hitman2714 выигрывает банк (9)
Дилер: Hand # 1684326626D
Дилер: у Guitou699 осталось 5 секунд до
действовать
Дилер: Guit¤u699 истекло время ожидания
Дилер: у Баджа Хасана осталось 5 секунд до
действовать
Дилер: Бай Хасан истекло время ожидания
Дилер: у hitman2714 осталось 5 секунд
действовать
Дилер: истекло время ожидания hitman2714
Система: ночная гарантия 10 000 долларов
начнется через 20 минут
Дилер: Дилер: Hand # 1684326626D
Дилер: Perspextive публикует большие
слепой 25

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

Дилер: 5 секунд осталось действовать
Дилер: hitman2714 выигрывает банк (9)
Дилер: Hand # 1684326626D
Дилер: у Guitou699 осталось 5 секунд, чтобы действовать
Дилер: Guit¤u699 истекло время ожидания
Дилер: у Баджа Хасана осталось 5 секунд, чтобы действовать
Дилер: Бай Хасан истекло время ожидания
Дилер: hitman2714 осталось 5 секунд действовать
Дилер: истекло время ожидания hitman2714
Система: ночная гарантия 10 000 долларов
начнется через 20 минут
Дилер: Дилер: Hand # 1684326626D
Дилер: Perspextive ставит большой блайнд 25

Ответы [ 4 ]

2 голосов
/ 16 декабря 2009
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: )/, ' ')
1 голос
/ 26 декабря 2009
content.gsub(/^(.*)\n(?!(Dealer|System|\Z))/, '\1 ')
1 голос
/ 16 декабря 2009
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 для ввода и вывода.

0 голосов
/ 16 декабря 2009

Grep

Зачем использовать ruby, если такой инструмент уже существует

cat oldfile | grep ^Dealer: > newfile

рубин

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

content= File.read(oldfile)
content= content.grep(/^Dealer:/)
File.open(newfile, "w") { |f| f.write(content) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...