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/

相关文章:

ruby - 如何检查到特定日期为止的剩余时间?

ruby - 如何通过 Ruby 中的索引从数组中获取多个值

windows - 使用 VBA 在给定目录中运行批处理文件

java - 从 Java 执行 cmd.exe 命令

java - 使用Java Formatter类时,为什么构造函数会创建一个txt文件,但不写入它?

javascript - 提交表单后,Ruby on Rails 保持复选框处于选中状态

Ruby Prawn 将元数据添加到模板

windows - ANSI 转义序列不会打印到 Windows 上的标准输出

java - rundll32 相当于在 Linux 平台中打开和查看文件

http - 包含多个文件的多部分 HTTP 请求应该是什么样的?