ruby - 如何从 Unix 将 DOS 行结尾写入文件

标签 ruby windows file unix encoding

我的 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/

相关文章:

windows - 在 DLL 中使用 cpu 特定功能有哪些标准技术?

windows - 批处理文件删除早于 N 天的文件并将结果保存为文本文件

ruby 性能 : define method with define_method or eval

ruby-on-rails - Rails 中嵌套资源的更新操作

ruby - ActiveRecord 模型的互斥锁

c++ - 在 C++ 的 unix shell 中也使用文本文件时,如何要求用户输入?

java - 类文件: constructor

ruby - 将包含数组的字符串转换为 Ruby 中的数组

java - 如何为我的跨平台 Jar 调用特定于 OS X 的方法?

c - 我正在编写一个程序来更改文件位置。但它无法正常工作