2016-05-09 5 views
4

私のUnix Rubyプログラムは、Windows上で実行されている SqlServerによって読み込まれるファイルを書き込む必要があります。私はこの ファイルに書き込む行が、のUNIX行の末尾ではなく、ではなく、\r\n、DOS/Windows行の終わりで終わるファイルが必要です。私は を手動で\ rを各行の最後に追加しなくても、これが起こることを望みます。UNIXからのファイルへのDOS行末の書き込み方法

出発点

私のプログラムは次のようにファイルへの書き込みをした場合:

File.open("/tmp/foo", "w") do |file| 
    file.puts "stuff" 
end 

次に、ファイルはUnixの行末を持っている:

私のプログラムから、期待されている
$ od -c foo 
0000000 s t u f f \n 

Unix上で動作しています。しかし、私は は、このファイル(とこのファイルのみ)がDOSの行末を持つ必要があります。私は手動で各ラインに\ rを追加した場合、各ライン手動

に\ rを追加

File.open("/tmp/foo", "w") do |file| 
    file.puts "stuff\r" 
end 

次に、ファイルがあるDOSの改行コード:

$ od -c /tmp/foo 
0000000 s t u f f \r \n 

この私が書いておきたい行ごとに繰り返さなければなりません。 this SO answerによって示されているように文字列#エンコード

を使用して

、私はそれを書き込む前に のString#エンコードを使用して文字列を変更できます。

File.open("/tmp/foo", "w") do |file| 
    file.puts "alpha\nbeta\n".encode(crlf_newline: true) 
end 

をこれはDOSの行末になり:

$ od -c /tmp/foo 
0000000 a l p h a \r \n b e t a \r \n 

これは、複数の行を一度に書くと、 #encodeを1回呼び出すと、すべてのその行の終わりを と書いてください。しかし、それは冗長であり、私はまだすべての書き込みに終わる という行を指定する必要があります。

私はむしろUnixのより終わるのWindows \r\nラインに にラインを終了するには、UNIXで開いているファイルに各putsを引き起こす可能性がありますどのように「\ n」を 行が終わりますか?

Ruby 2.3.1を実行しています。このためのオプションがあります

答えて

9

は、あなたがencodeに使用しているものと同じものもFile.openで動作します:

File.open('/tmp/foo', mode: 'w', crlf_newline: true) do |file| 
    file.puts("alpha") 
    file.puts("beta") 
end 

このオプションがないだけで、それも\r\nへの明示的な\nを変換し、\r\nで行を終了します。だから、この:

file.puts("alpha\nbar") 

`crlf_newline`オプションもTempfile``と連携alpha\r\nbar\r\b

+1

ノートを書きます – Dennis

関連する問題