我的Unix Ruby程序需要編寫一個文件,該文件將被 在Windows上運行的SqlServer讀取。我需要爲這條 文件寫入的行以\r\n
結尾,DOS/Windows行結束,而不是\n
, Unix行結束。我希望這種情況發生,而我不得不手動將\ r添加到每行的末尾。如何將DOS行結尾寫入Unix的文件
起點
如果我的程序寫入到這樣的文件:
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,我可以寫它之前修改使用 字符串#編碼字符串:
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的一次調用將改變所有爲那一個 編寫的行結尾。但是,它是冗長的,我仍然需要指定每行寫入結束行 。
我怎樣才能使每個puts
在Unix的打開的文件結束 在結尾,而不是Unix的「\ n」結尾 線在Windows \r\n
行的行?
我正在運行Ruby 2.3.1。
注意'crlf_newline'選項還與'Tempfile' – Dennis