Заголовки на втором ряду в FasterCSV? - PullRequest
2 голосов
/ 27 мая 2010

Добрый день, ребята, в настоящее время я использую командуCSCSV для анализа файла CSV в ruby ​​и задаюсь вопросом, как избавиться от начальной строки данных в CSV (Начальная строка содержит информацию о времени и дате, созданную другим пакет программ)

Я попытался использовать fastCSV.table, затем удалил строку (0), затем преобразовал ее в документ CSV, затем проанализировал ее

но строка все еще присутствовала в документе.

Есть еще идеи?

fTable = FasterCSV.table("sto.csv", :headers => true)
fTable.delete(0)

Ответы [ 3 ]

4 голосов
/ 27 мая 2010

Три предложения


Можете ли вы заставить 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
2 голосов
/ 07 мая 2013

Я делаю это с некоторыми данными для Избирательной комиссии Австралии. Файл, о котором идет речь, имеет строку даты в первой строке и заголовки во второй

require 'csv'
require 'open-uri'

filename = "http://results.aec.gov.au/15508/Website/Downloads/SenateGroupVotingTicketsDownload-15508.csv"
file = File.open(open(filename))
first_line = file.readline
CSV.parse(file, headers: true).each do |row|
  puts row["State"]
end

Я предполагаю, что файл, который я цитирую, все еще существует, но его можно заменить соответствующим файлом. если вам нужно пропустить больше строк, вы должны вызвать file.readline это число раз.

1 голос
/ 27 мая 2010

Согласно документам, fTable = FasterCSV.table("sto.csv", :return_headers => false) должен делать то, что вы хотите. .table подразумевает :headers => true Документы имеют эту информацию.

...