Разбор CSV-файлов с экранированными символами новой строки в Ruby? - PullRequest
3 голосов
/ 09 июля 2009

Как мне разобрать файлы CSV с экранированными символами новой строки в Ruby? Я не вижу ничего очевидного в CSV или FasterCSV.

Вот несколько примеров ввода:

"foo", "bar"
"rah", "baz \
and stuff"
"green", "red"

В Python я бы сделал это:

csvFile = "foo.csv"
csv.register_dialect('blah', escapechar='\\')
csvReader = csv.reader(open(csvFile), "blah")

Ответы [ 2 ]

7 голосов
/ 10 июля 2009

Если поля, включающие символ новой строки, правильно заключены в кавычки (как в данных вашего примера), то синтаксический анализатор Ruby csv может с ними справиться. Однако, если вы хотите, чтобы Ruby удалил escape-символ (как Python, кажется, может сделать, задав escapechar), то я также не вижу метода для этого в документах Ruby. (Кстати, начиная с Ruby 1.9 FasterCSV является реализацией csv по умолчанию в Ruby.)

#!/usr/bin/env ruby -w
require 'csv'

CSV.foreach('test.csv') do |rec|
  puts "Record: #{rec}"
end

Выход:

telemachus ~ $ ruby read.rb 
Record: ["foo", "bar"]
Record: ["rah", "baz \\\nand stuff"]
Record: ["green", "red"]
1 голос
/ 10 июля 2009

Я не эксперт по Ruby, поэтому простите за любые ошибки в этом направлении.

Вы не можете сделать это за один шаг с регулярным выражением (которое я знаю). Приведенный выше код Python не является регулярным выражением, поэтому не ожидайте использовать регулярное выражение, которое делает то же самое.

Вы можете сделать это в два этапа, используя Perl-совместимое регулярное выражение, но когда я попробовал его на установленной мной версии Ruby, Ruby пожаловался. Обычно вы читаете весь файл, затем разделяете () файл, используя отрицательный взгляд назад, а затем разделяете () каждый элемент, возвращаемый из этого на a,.

Например:

$allLines=$wholeFile.split(/(?<!\\)\n/m);

Но Руби жалуется, что последовательность (? <! Не распознана. Поэтому вам, вероятно, придется прибегнуть к какому-либо другому методу. Я бы порекомендовал библиотеку, специально предназначенную для анализа CSV, например: <a href="http://snippets.aktagon.com/snippets/246-How-to-parse-CSV-data-with-Ruby" rel="nofollow noreferrer">http://snippets.aktagon.com/snippets/246-How-to-parse-CSV-data-with-Ruby

...