如何在Ruby中确定行结束类型

时间:2015-12-15 20:24:09

标签: ruby line-endings

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

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

更新

以下答案是我问题的正确答案。但是,如果您需要CSVLint中的自动行结尾,请尝试使用方言:

"lineTerminator" => :auto

此外,@ sawa的回答属于我原来的问题(和拼写错误),即寻找\r\r\n

2 个答案:

答案 0 :(得分:2)

要检测\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非常有趣。

答案 1 :(得分:1)

修改以下是原始问题的答案,而不是更改后的问题。

如果您有第一行line

line[/[\r\n]+/]

将为您提供结束的行。