Три предложения
Можете ли вы заставить FasterCSV игнорировать строку?
Вы можете использовать опцию: return_headers => true, чтобы пропустить плохую строку. Это будет прекрасно работать, если вторая строка не является настоящим заголовком. Смотрите здесь , чтобы узнать больше
: return_headers:
Когда ложь, строки заголовка молча
проглатывание. Если установлено значение true, строки заголовка
возвращаются в FasterCSV :: Row
объект с одинаковыми заголовками и
поля (за исключением того, что поля не идут
через конвертеры).
Отрезать линию другим инструментом
Вам не нужно использовать Ruby для этого - как насчет того, чтобы нарезать файл, используя одно из предложенных решений здесь , вы можете вызывать однострочники из Ruby, используя системный метод.
Максимальная гибкость - анализируйте файл построчно с помощью FasterCSV
Рассматривали ли вы чтение файла напрямую, пропуская первую строку, а затем принимая или отклоняя строки? В основе моего кода лежит метод синтаксического анализа, который обрабатывает файл как последовательность строк, принимая или отклоняя каждую из них. Вы можете сделать что-то подобное, но пропустите первый ряд.
Удобно то, что вы можете определить, какие строки являются приемлемыми, определяя свои собственные приемлемые? метод - только допустимые данные CSV передаются приемлемым? остальные выбрасываются в ответ на исключение.
def parse(file)
#
# Parse data
#
row = []
file.each_line do |line|
the_line = line.chomp
begin
row = FasterCSV.parse_line(the_line)
ok, message = acceptable?(row)
if not ok
reject(file.lineno, the_line, message)
else
accept(row, the_line)
end
rescue FasterCSV::MalformedCSVError => e
reject(file.lineno, the_line, e.to_s)
end
end