2010-02-19 48 views
2

我在这竟然放弃了我的CSV文件以下行的问题在解析时:使用FasterCSV解析此行的正确方法?

312,'997639',' 2','John, Doe. "J.D." ',' ','2000 ',' ','Street ','City ','NY','99999','','2010-02-17 19:12:04','2010-02-17 19:12:04';

我用下面的参数解析:

FasterCSV.foreach(file, {:headers => true, :quote_char => '"', :col_sep => "','"}) do |row| 

然而,对行炸毁就像上面那个由于行列中的“JD”一样。我如何正确解析这一行与FasterCSV?

谢谢!

回答

0

我一直无法弯曲FasterCSV上班这种方式我需要它与这个数据,所以最终的结果只需要一个新的数据转储与正确的CSV输出。感谢您的尝试!

3

它在我看来像你的:quote_char应该是':col_sep应该是,。在这种情况下:

FasterCSV.foreach(file, {:headers => true, :quote_char => "'", :col_sep => ','}) ... 
+0

导致FasterCSV :: MalformedCSVError(FasterCSV :: MalformedCSVError) 异常抛出。 – mwilliams 2010-02-19 00:53:32

+1

您的CSV如何生成?你确定它是完好的吗? :quote_char指定环绕字段的字符,在您的示例中看起来像是单引号,并且:col_sep指定字段之间的字符,在您的示例中它似乎是逗号。这是我根据我的回答得到的信息。 – 2010-02-19 01:00:01

+0

问题是它没有形成良好,我试图弯曲FasterCSV来解析它。转储来自客户,我已经发送了适当的SQL查询来输出正确的CSV。与此同时,我仍然试图破解它。 – mwilliams 2010-02-19 01:06:22

1

你不能那样做。 FasterCSV只允许选择一个引用字符,而您的应用程序需要两个。没有办法做可爱的东西一样传递一个正则表达式,而不是一个字符,因为FasterCSV预编译的匹配与引号字符转义如下:

# prebuild Regexps for faster parsing 
esc_col_sep = Regexp.escape(@col_sep) 
esc_row_sep = Regexp.escape(@row_sep) 
esc_quote = Regexp.escape(@quote_char) 
@parsers = { 
    :any_field  => Regexp.new("[^#{esc_col_sep}]+", 
           Regexp::MULTILINE, 
           @encoding), 
    :quoted_field => Regexp.new("^#{esc_quote}(.*)#{esc_quote}$", 
           Regexp::MULTILINE, 
           @encoding), 
    ... 
}