如何确定 Ruby 中的行尾类型
How to determine line ending types in Ruby
我正在使用 CSVLint 对平面文件进行 运行 一些验证。文件的来源可以有不同的行尾,有些是 \n
,有些是 \r\n
。 Validator
构造函数采用 dialect
参数,我需要在其中指定行结束类型。
有没有good/quick/easy方法对平面文件的第一行进行采样以确定Ruby中的行结束类型?
更新
下面的答案是我问题的正确答案。但是,如果您需要在 CSVLint 中自动换行,请在方言中尝试:
"lineTerminator" => :auto
此外,@sawa 下面的回答与我寻找 \r
和 \r\n
.
的原始问题(和拼写错误)有关
编辑以下是原题的回答,不是修改后的问题
当你有第一行时 line
,
line[/[\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 非常有趣。
我正在使用 CSVLint 对平面文件进行 运行 一些验证。文件的来源可以有不同的行尾,有些是 \n
,有些是 \r\n
。 Validator
构造函数采用 dialect
参数,我需要在其中指定行结束类型。
有没有good/quick/easy方法对平面文件的第一行进行采样以确定Ruby中的行结束类型?
更新
下面的答案是我问题的正确答案。但是,如果您需要在 CSVLint 中自动换行,请在方言中尝试:
"lineTerminator" => :auto
此外,@sawa 下面的回答与我寻找 \r
和 \r\n
.
编辑以下是原题的回答,不是修改后的问题
当你有第一行时 line
,
line[/[\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 非常有趣。