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

时间:2016-05-09 16:40:16

标签: ruby windows file unix encoding

我的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添加到每行

如果我手动将\ 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

这有效,但必须为我想写的每一行重复。

使用String #coding

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。

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