问题描述
|
我正在尝试处理可以使用CF或LF作为EOL标记生成的CSV文件。当我尝试读取文件时
infile = File.open(\'my.csv\',\'r\')
while line = infile.gets
...
整个20MB文件作为一行读入。
如何正确检测和处理?
TIA
解决方法
我将处理文件,将输入标准化,然后将其输入CSV:
raw = File.open(\'my.csv\',\'rb\',&:read).gsub(\"\\r\\n\",\"\\n\")
CSV.parse(raw) do |row|
# use row here...
end
由于Windows Ruby上的文件读取速度较慢,因此上述方法使用File.open
而不是IO.read
。
, 如有疑问,请使用正则表达式。
> \"how\\r\\nnow\\nbrown\\r\\ncow\\n\".split /[\\r\\n]+/
=> [\"how\",\"now\",\"brown\",\"cow\"]
所以,像
infile.read.split(/[\\r\\n]+/).each do |line|
. . .
end
现在,事实证明标准库CSV已经可以理解混合行的结尾,因此您可以执行以下操作:
CSV.parse(infile.read).each do |line|
. . .