我的Unix Ruby程序需要编写一个可以读取的文件
在Windows上运行的SqlServer。我需要为此写的行
文件以\r\n
结尾,DOS / Windows行结束,而不是\n
,
Unix行结束。我想要在没有我的情况下发生这种情况
手动将\ r \ n添加到每行的末尾。
如果我的程序写入这样的文件:
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 \ n添加到每行:
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 中的打开文件结束
Windows \r\n
行结尾的行而不是Unix'\ n'
行结束?
我正在运行Ruby 2.3.1。
答案 0 :(得分:11)
有一个选项,您在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")
将写alpha\r\nbar\r\b