如何从Unix编写DOS行结尾到文件

Way*_*rad 8 ruby unix windows encoding file

我的Unix Ruby程序需要编写一个将在Windows上运行的SqlServer读取的文件.我需要将我写入此文件的\r\n行结束,DOS/Windows行结束,而不是\nUnix行结束.我希望这发生在没有我必须手动将\ r \n添加到每行的末尾.

出发点

如果我的程序写入这样的文件:

File.open("/tmp/foo", "w") do |file|
  file.puts "stuff"
end
Run Code Online (Sandbox Code Playgroud)

然后该文件具有Unix行结尾:

$ od -c foo
0000000   s   t   u   f   f  \n
Run Code Online (Sandbox Code Playgroud)

这是预期的,因为我的程序在Unix上运行.但我需要这个文件(只有这个文件)有DOS行结尾.

手动将\ r添加到每一行

如果我手动将\ r \n添加到每行:

File.open("/tmp/foo", "w") do |file|
  file.puts "stuff\r"
end
Run Code Online (Sandbox Code Playgroud)

然后该文件有DOS行结尾:

$ od -c /tmp/foo
0000000   s   t   u   f   f  \r  \n
Run Code Online (Sandbox Code Playgroud)

这可行,但必须为我想写的每一行重复.

使用String #coding

如此SO答案所示,我可以在编写之前使用String #coding修改字符串:

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

这导致DOS行结尾:

$ od -c /tmp/foo
0000000   a   l   p   h   a  \r  \n   b   e   t   a  \r  \n
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,如果我一次写多行,则对#encode的一次调用将改变该一次写入的所有行结尾.但是,它很冗长,我仍然必须指定每次写入的结束行.

如何让每个Unix中puts的打开文件结束Windows 行结尾的行而不是Unix'\n'行结束?\r\n

我正在运行Ruby 2.3.1.

tad*_*man 12

有一个选项,你正在使用的同一个encode也适用于File.open:

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

此选项不仅会结束行\r\n,还会将任何显式\n转换为\r\n.所以这:

file.puts("alpha\nbar")
Run Code Online (Sandbox Code Playgroud)

将会写 alpha\r\nbar\r\b

  • 注意`crlf_newline`选项也适用于`Tempfile` (2认同)