Как мне написать парсер файлов TSV, где если строка содержит x, то сохранить?

Я хочу открыть файл TSV (значения, разделенные табуляцией) и сохранить определенные строки в новый файл CSV (значения, разделенные запятыми).

Если строка содержит 'NLD' в поле с заголовком «Actor1Code», я хочу сохранить строку в CSV; если нет, я хочу перейти к следующей строке. Это то, что у меня есть до сих пор, но, видимо, этого недостаточно:

require 'csv'

CSV.open("path/to.csv", "wb") do |csv| #csv to save to
  CSV.open('data.txt', 'r', '\t').each do |row| #csv to scrape
    if row['Actor1Code'] == 'NLD'
      csv << row
    else
    end
  end
end

person Seeb    schedule 10.09.2013    source источник
comment
Так в чем проблема?   -  person Yevgeniy Anfilofyev    schedule 10.09.2013
comment
Попробуйте использовать "\t", двойные кавычки.   -  person nicooga    schedule 10.09.2013
comment
Пробовал с двойными кавычками, все равно не работает. Возможно, это связано с расширением .txt?   -  person Seeb    schedule 10.09.2013
comment
код ошибки: in 'initialize': can't convert String into Integer (TypeError) from /usr/lib/ruby/1.9.1/csv.rb:1342:in 'open' from /usr/lib/ruby/1.9.1/csv.rb:1342:in 'open' from code/csv_code/csv_protestscraper_c.rb:5:in 'block in <main>' from /usr/lib/ruby/1.9.1/csv.rb:1354:in 'open' from code/csv_code/csv_protestscraper_c.rb:3:in '<main>   -  person Seeb    schedule 10.09.2013
comment
CSV ничего не знает о заголовках, если не добавляет код или опции для управления ими. Вероятно, это то, с чем вам нужна помощь. Ошибка жалуется на использование String для доступа к элементу в строке Array. Если бы вы добавили к вопросу упрощенный (2-3 столбца, 2-3 строки) образец из вашего файла, вам было бы легче помочь.   -  person Neil Slater    schedule 10.09.2013


Ответы (1)


Вы уверены, что правильно звоните CSV.open? Документация кажется чтобы предложить аргументы, передаются в виде хэшей:

CSV.open('data.txt', 'r', col_sep: "\t")

Ошибка, которую вы видите, вероятно, является результатом того, что '\t' интерпретируется как хэш и на него ссылается [].

person tadman    schedule 10.09.2013
comment
Хорошо, я изменил его на , :col_sep: \t. Выдает новую ошибку: syntax error, unexpected tSTRING_BEG, expecting ')' CSV.open("1990_reduced.tsv", "r", :col_sep "\t") do |row| - person Seeb; 10.09.2013
comment
Синтаксис чрезвычайно важен. Я использую хэш-нотацию Ruby 1.9 col_sep: "\t", но вы сделали это как неполный старый стиль: :col_sep => "\t". Такие детали нельзя не заметить. - person tadman; 10.09.2013