ruby - 以二进制模式打开文件并保存它添加新行

标签 ruby file-io binary newline

为什么要在文件中的每一行中添加一个新行?

text = File.read('1.txt', mode: 'rb', encoding: 'UTF-8')  
File.write('1.txt', text, encoding: 'UTF-8')

如果我删除二进制模式,它又是正常的,但我需要它用于另一种编码(UTF-16LE)。

测试它 - http://asdfasd.net/ruby/binary_adds_newline.zip

最佳答案

我进行了一些测试;这取决于你的线路结束的方式。当它们以 either LF (\n) 或 CR (\r ) 它会产生你期望的输出。也就是说,没有添加新行。但是,如果您有 CRLF (\r\n),它将在每一行之后添加一个 CR 字符,从而有效地以 CRCR+LF 产生额外的行。

大多数编程编辑器都允许您选择一个使行尾可见的选项。

我不确定为什么会发生这种情况,但可能与 the IO docs 中的以下片段有关在 'b' 模式下:

Suppresses EOL <-> CRLF conversion on Windows.

似乎当使用二进制模式时,CRLF(Windows 上的默认行尾)被转换为 LF。因此,简单的解决方案似乎只是将所有 \r\n 替换为 \n\r。你可以这样做:

File.open('converted.txt', 'wb') do |converted|
  File.open('1.txt', 'rb').each_line do |line|
    converted << line.gsub("\r\n", "\n") # Replace CRLF with LF
  end
end

如果您在同一个文件上多次运行该脚本,您应该确保在写回之前将 CRLF 替换为 LF:

# Note the .gsub at the end here
text = File.read('1.txt', mode: 'rb', encoding: 'UTF-8').gsub("\r\n", "\n")
File.write('1.txt', text, encoding: 'UTF-8')

关于ruby - 以二进制模式打开文件并保存它添加新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25322704/

相关文章:

Ruby:是否有可能一次增加一个以上的 for 循环?

java - 在java中增量访问文件,同时动态更新文件?

java - 确定 Java 中的二进制/文本文件类型?

ruby-on-rails - 在 ruby​​ 中编写 if 条件的更好方法

ruby - 当你运行 "rails server"时,你如何让 ruby​​ 版本与你看到的 "ruby -v"相匹配?

c - 从 C 文件中读取数字

c - 如何从输入中正确扫描一行并写入输出文件

c - 用C语言将原始二进制文件写入文件

open-source - 如何处理死掉的开源依赖?

ruby - 在 Google Drive API 中收到错误 403 - 超出了未经身份验证使用的每日限制。继续使用需要注册