Как удалить возврат каретки с помощью Ruby?



Я думал, что этот код будет работать, но регулярное выражение никогда не соответствует rn. я просмотрел данные, которые я читаю в шестнадцатеричном редакторе, и проверил, что в файле действительно есть шестнадцатеричный D и шестнадцатеричный шаблон.



Я также пробовал регулярные выражения /xDxA /m и/x0Dx0A / m, но они также не совпадали.



Это мой код прямо сейчас:



   lines2 = lines.gsub( /rn/m, "n" )
if ( lines == lines2 )
print "still the samen"
else
print "made the changen"
end


в дополнение к альтернативам, было бы неплохо знать, что я делаю неправильно (чтобы облегчить некоторые обучение с моей стороны). :)

517   14  

14 ответов:

что вы получаете, когда вы делаете puts lines? Это даст вам ключ к разгадке.

по умолчанию File.open открывает файл в текстовом режиме, так что ваши \r\n символы будут автоматически преобразованы в \n. Может быть, это и есть причина lines всегда равна lines2. Чтобы предотвратить Ruby от разбора конца строки используйте rb режим:

C:\> copy con lala.txt
a
file
with
many
lines
^Z

C:\> irb
irb(main):001:0> text = File.open('lala.txt').read
=> "a\nfile\nwith\nmany\nlines\n"
irb(main):002:0> bin = File.open('lala.txt', 'rb').read
=> "a\r\nfile\r\nwith\r\nmany\r\nlines\r\n"
irb(main):003:0>

но из вашего вопроса и кода я вижу, что вам просто нужно открыть файл с модификатором по умолчанию. Вам не нужны преобразование и может использовать более короткий File.read.

использовать строка#strip

возвращает копию str с удаленными начальными и конечными пробелами.

Эл.г

"    hello    ".strip   #=> "hello"   
"\tgoodbye\r\n".strip   #=> "goodbye"

С помощью gsub

string = string.gsub(/\r/," ")
string = string.gsub(/\n/," ")

Как правило, когда я имею дело с зачисткой \r или \n, я буду искать оба, делая что-то вроде

lines.gsub(/\r\n?/, "\n");

Я обнаружил, что в зависимости от того, как были сохранены данные (используемая ОС, используемый редактор, отношение Юпитера к Io в то время) может быть или не быть новой строки после возврата каретки. Кажется странным, что вы видите оба символа в шестнадцатеричном режиме. Надеюсь, это поможет.

modified_string = string.gsub(/\s+/, ' ').strip
lines2 = lines.split.join("\n")

Если вы используете рельсы, есть squish метод

"\tgoodbye\r\n".squish => "goodbye"

"\tgood \t\r\nbye\r\n".squish => "good bye"

"still the same\n".chomp
или
"still the same\n".chomp!

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-chomp

Как насчет следующих?

irb(main):003:0> my_string = "Some text with a carriage return \r"
=> "Some text with a carriage return \r"
irb(main):004:0> my_string.gsub(/\r/,"")
=> "Some text with a carriage return "
irb(main):005:0>

или...

irb(main):007:0> my_string = "Some text with a carriage return \r\n"
=> "Some text with a carriage return \r\n"
irb(main):008:0> my_string.gsub(/\r\n/,"\n")
=> "Some text with a carriage return \n"
irb(main):009:0>

Почему бы не прочитать файл в текстовом режиме, а не бинарном режиме?

вы можете использовать это :

my_string.strip.gsub(/\s+/, ' ')
lines.map(&:strip).join(" ")

Я думаю, что ваше регулярное выражение почти завершено-вот что я бы сделал:

lines2 = lines.gsub(/[\r\n]+/m, "\n")

в приведенном выше примере я поместил \r и \n в класс (таким образом, не имеет значения, в каком порядке они могут появиться) и добавил квалификатор " + " (так что "\r\n\r\n\r\n" также будет соответствовать один раз, и все это заменено на "\n")

просто еще один вариант:

lines.delete(" \n")
def dos2unix(input)
  input.each_byte.map { |c| c.chr unless c == 13 }.join
end

remove_all_the_carriage_returns = dos2unix(some_blob)

Comments

    Ничего не найдено.