Правильный способ разобрать эту строку с FasterCSV? - PullRequest
2 голосов
/ 19 февраля 2010

У меня есть следующая строка в CSV-файле, которая вызывает проблемы при разборе:

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?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 19 февраля 2010

Мне кажется, что ваш :quote_char должен быть ', а ваш :col_sep должен быть ,. В этом случае:

FasterCSV.foreach(file, {:headers => true, :quote_char => "'", :col_sep => ','} ) ...
1 голос
/ 19 февраля 2010

Вы не можете этого сделать. 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 ),
  ...
}
0 голосов
/ 19 февраля 2010

Я не смог согнуть FasterCSV, чтобы работать с этими данными так, как мне нужно, поэтому в результате я просто запросил новый дамп данных с соответствующим выводом CSV. Спасибо за попытки!

...