拆分CSV文件,同时忽略逗号并使用Ruby返回引号内的字符

时间:2011-06-20 07:37:50

标签: ruby csv

我想将CSV行拆分为单独的字段,但在某些字段中有逗号或换行符。
如果我使用line.split(','),它会在引号中选取逗号,如果我使用CSV类,则由于新行而导致格式错误。

3 个答案:

答案 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