我正在使用CSVLint对平面文件运行一些验证。文件的源可以有不同的行尾,有些是\n
,有些是\r\n
。Validator
构造函数接受一个dialect
参数,在这里我需要指定行尾类型。
有没有一种好的/快速/简单的方法来采样平面文件的第一行,以确定ruby中的行尾类型?
更新
下面的答案是我问题的正确答案。但是,如果您需要csvlint中的自动行尾,请在方言中尝试:
"lineTerminator" => :auto
另外,@sawa下面的答案与我最初的问题(和输入错误)有关,我想查找
\r
和\r\n
。 最佳答案
要检测\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年停产)这样的奇怪的边缘情况,但涵盖了所有其他方面。如果您想了解历史行结尾的背景,那么Wikipedia article非常有趣。
关于ruby - 如何在Ruby中确定行尾类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34298702/