web-dev-qa-db-ja.com

Rubyでキャリッジリターンを削除するにはどうすればよいですか?

このコードは機能すると思いましたが、正規表現は\ r\nと一致しません。読み込んでいるデータを16進エディタで表示し、ファイルに実際に16進Dと16進Aのパターンがあることを確認しました。

正規表現/\xD\xA/mおよび/\x0D\x0A/mも試しましたが、一致しませんでした。

これは今の私のコードです:

   lines2 = lines.gsub( /\r\n/m, "\n" )
   if ( lines == lines2 )
       print "still the same\n"
   else
       print "made the change\n"
   end

代替案に加えて、私が何を間違っているのかを知ることは素晴らしいことです(私の側でいくつかの学習を促進するため)。 :)

68
Jeremy Mullin

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を使用できます。

23
Rômulo Ceccon

String#strip を使用します

先頭および末尾の空白を削除したstrのコピーを返します。

例えば

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

Gsubを使用する

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

一般に、\ rまたは\ nの除去を扱うときは、次のようなことをして両方を探します。

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

データの保存方法(使用するOS、使用するエディター、当時のIoとのジュピターの関係)に応じて、改行の後に改行がある場合とない場合があります。 16進モードで両方の文字が表示されるのは奇妙に思えます。お役に立てれば。

35
localshred
modified_string = string.gsub(/\s+/, ' ').strip
17
Vik

Railsを使用している場合、squishメソッドがあります

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

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

16
neck
lines2 = lines.split.join("\n")
15
Cameron Price

"still the same\n".chomp
または
"still the same\n".chomp!

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

14
Joel AZEMAR

次はどうですか?

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>
6
mwilliams

あなたの正規表現はほぼ完全だと思います-私がすることは次のとおりです:

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

上記では、クラスに\ rと\ nを入れて(そのように表示される順序は関係ありません)、「+」修飾子を追加しました(したがって、「\ r\n\r\n\r\n "も1回一致し、全体が"\n "に置き換えられます)

2
Nathan Crause

バイナリモードではなく、テキストモードでファイルを読み取らないのはなぜですか?

2
Andrew Grimm

ちょうど別のバリアント:

lines.delete(" \n")
2
k1r8r0wn

これを使用できます:

my_string.strip.gsub(/\s+/, ' ')
1
Alain Beauvois
lines.map(&:strip).join(" ")
1
frenesim
def dos2unix(input)
  input.each_byte.map { |c| c.chr unless c == 13 }.join
end

remove_all_the_carriage_returns = dos2unix(some_blob)
0
Dennis