我的 Unix Ruby 程序需要编写一个文件,供其读取
Windows 上运行的 SqlServer。我需要我写给这个的行
文件以 \r\n
结束,DOS/Windows 行结束,而不是 \n
,
Unix 行结尾。我希望这一切发生而我不必
手动将\r 添加到每行的末尾。
起点
如果我的程序像这样写入文件:
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
这行得通,但必须为我想写的每一行重复。
使用字符串#encode
如this SO answer所示,我可以使用修改字符串 String#encode 在写入之前:
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 将更改该行的所有行尾 写。但是,它很冗长,我仍然必须指定行 每次写入结束。
在 Unix 中,如何使每个 put
到一个打开的文件结束
Windows \r\n
行结尾的行而不是 Unix '\n'
行尾?
我正在运行 Ruby 2.3.1。
最佳答案
这里有一个选项,您在 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
关于ruby - 如何从 Unix 将 DOS 行结尾写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37121061/