Как анализировать данные из файла TXT с разделителем табуляции? - PullRequest
1 голос
/ 01 июля 2011

Я использую ruby ​​1.8.7, рельсы 2.3.8. Я хочу проанализировать данные из файла дампа TXT, разделенных табуляцией.

В этом TXT-дампе содержится некоторое свойство CSS, которое выглядит так, как будто содержит недопустимые данные

enter image description here

Когда мой код запускается с использованием FasterCSV gem

  FasterCSV.foreach(txt_file, :quote_char => '"',:col_sep =>'\t', :row_sep =>:auto, :headers => :first_row) do |row|
  col= row.to_s.split(/\t/)
  puts col[15]
  end

ошибка, записанная в консоли как «Недопустимое цитирование в строке 38». Может ли кто-нибудь предложить мне, как пропустить строку, содержащую недопустимые данные, и продолжить процесс загрузки данных оставшихся строк?

Ответы [ 3 ]

3 голосов
/ 01 июля 2011

Вот один из способов сделать это. Мы переходим на более низкий уровень, используя shift для анализа каждой строки, а затем отключаем исключение MalformedCSVError, продолжая следующую итерацию. Проблема в том, что цикл выглядит не очень хорошо. Если кто-то может улучшить это, вы можете редактировать код.

FasterCSV.open(filename, :quote_char => '"', :col_sep => "\t", :headers => true) do |csv|
  row = true
  while row
    begin
      row = csv.shift
      break unless row

      # Do things with the row here...
    rescue FasterCSV::MalformedCSVError
      next
    end
  end
end
1 голос
/ 12 марта 2012

Так что проблема в том, что файлы TSV не имеют символа кавычки. В спецификации просто указывается, что вам запрещено иметь вкладки в данных.

Библиотека CSV на самом деле не поддерживает этот вариант использования. Я решил эту проблему, указав символ кавычки, который, как я знаю, не будет отображаться в моих данных. Например

CSV.parse(txt_file, :quote_char => '☎', :col_sep => "\t" do |row|
   puts row[15] 
end
1 голос
/ 01 июля 2011

Просто прочитайте файл как обычный (не с FasterCSV), разделите его, как вы знаете, на \t, и он должен работать

...