我想将CSV行拆分为单独的字段,但在某些字段中有逗号或换行符。
如果我使用line.split(',')
,它会在引号中选取逗号,如果我使用CSV类,则由于新行而导致格式错误。
答案 0 :(得分:8)
我确信自我实现它正在重新发明轮子。如果stdlib的CSV类不满足,请尝试另一种实现FasterCSV。
确保输入格式是否正确:新行和逗号以及引号内的转义引号。
更新:根据Generating fields containing newline with Ruby CSV::Writer stdlib的CSV,包含换行符的字段存在问题。我想它首先使用newline作为分隔符盲目地分割行,而不考虑任何转义。
答案 1 :(得分:2)
您需要知道输入csv文件的格式,它需要有效。 如果逗号不是字段分隔符,则必须指定char是分隔符。
csv文件的处理可能如下所示:
CSV.foreach(fname_in, {:col_sep => ';', :quote_char => '"',
:headers => true,
:encoding => Encoding::UTF_8}) do
|row|
...
# do some stuff with the row
...
end
正如您所看到的,如何描述输入格式有更多选项。请参阅csv模块CSV class的Ruby doc。
答案 2 :(得分:2)
FasterCSV有一个方便的parse_line()方法,可以很好地复制.split(',')在创建数组时的功能,同时遵守双引号字符串中逗号的规则。
require 'csv'
CSV.parse_line(line)
示例...
require 'csv'
line='"PBN, Inc.",100,10'
puts(line.chomp.split(','))
"PBN
Inc."
100
10
puts(CSV.parse_line(line))
PBN, Inc.
100
10