ruby - 如何确定 Ruby 中的行结束类型

标签 ruby line-endings

我正在使用CSVLint对平面文件运行一些验证。文件的源可以有不同的行结尾,有些是 \n,有些是 \r\nValidator 构造函数采用一个 dialect 参数,我需要在其中指定行结束类型。

是否有一种好的/快速/简单的方法来对平面文件的第一行进行采样以确定 Ruby 中的行结束类型?

更新

下面的答案是我问题的正确答案。但是,如果您需要在 CSVLint 中自动换行,请在方言中尝试此操作:

"lineTerminator" => :auto

此外,@sawa 下面的回答与我寻找 \r\r\n 的原始问题(和拼写错误)有关。

最佳答案

要检测 \n\r\n 行结尾,只需将第一行与正则表达式 /\r?\n$/< 进行匹配:

def determine_line_ending(filename)
  File.open(filename, 'r') do |file|
    return file.readline[/\r?\n$/]
  end
end

determine_line_ending('./windows_file.csv')
# => "\r\n"

determine_line_ending('./unix_file.csv')
# => "\n"

这不处理奇怪的边缘情况,如 Mac OS 9(2001 年停产)\r 行结尾,但涵盖了其他所有内容。如果您想了解历史行结尾的一些背景信息, Wikipedia article很有趣。

关于ruby - 如何确定 Ruby 中的行结束类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34298702/

相关文章:

ruby - 如何避免双重编码 URI

ruby-on-rails - 如何知道要拯救哪些异常?

linux - 如果文件具有 Windows 行结尾,请将其更改为 Linux 行结尾,否则不执行任何操作

bash - 匹配以 grep 结尾的 unix 行

visual-studio - 将 Visual Studio 配置为使用 UNIX 行结尾

ruby - 将控制台消息与代码分开

ruby-on-rails - Rails 嵌套模型与 formattastic 是否跳过一个字段?

ruby-on-rails - 为什么 sqlite3-ruby-1.2.2 不能在 OS X 上运行?

git - git autocrlf 设置的权威推荐

windows - 处理 Git 拒绝重置的文件?