2010-07-19 4 views
3

Для огромного количества огромных файлов csv (100M строк +) из разных источников Мне нужен быстрый фрагмент или библиотека, чтобы автоматически угадывать формат даты и преобразовывать его в режим распада или времени unix -печать. Как только успешно догадался, фрагмент должен иметь возможность проверять последующие вхождения поля даты на достоверность, потому что, вероятно, формат даты изменяется по всему файлу.Быстрое автоматическое угадывание строк даты

Тестовый набор форматов даты должен быть переменным, но компиляция оптимального дерева решений или что-то из числа заданных форматов дат прекрасна.

Я пришел к выводу, что ничего подобного не существует, но все же необходимо провести «исследование рынка», следовательно, мой вопрос.

Моя первая попытка состояла в том, чтобы имитировать getdate() для 23 разных форматов дат, которые я наблюдал до сих пор, и заменить парсеры числа оптимизированными версиями, учитывающими характеристики даты (от «4» до «9») в десятидневной части, от «3» до «9» в десятках части месяца и т. д.)

Неужели кто-нибудь сталкивается с подобной проблемой или даже создает код такого рода?

+0

Имеет ли каждый файл CSV только один формат даты, или они являются микс? –

+0

Обычно это только один формат для каждого файла, но иногда они меняют формат по всему файлу, вероятно, результат совместного использования кота. Довольно часто вы видите, что импорт в базу данных преуспевает для первых 98 миллионов строк, а затем следующие 40 миллионов строк полностью увязаны. – hroptatyr

+2

Будет сложно, если у вас есть определенные форматы дат. Является ли «060804» 8 июня 2004 года, 6 августа 2004 года (европейский), или 4 августа 2006 года (yymmdd)? У вас могут не быть таких форматов, но если вы это сделаете, вам придется выбирать, и вы можете обнаружить, что выбрали неверно. Если это постоянная нагрузка, посмотрите, можете ли вы вернуться к источнику и заставить их исправить это. Если это разовая вещь, вам придется запутаться. – mattmc3

ответ

1

После двух недель чрезмерного просмотра google \ Wweb я пришел к выводу, что я должен сам написать это. FTW, я первый пробовал в этом: http://github.com/hroptatyr/glod

1

Я имел дело с временными данными датчиков (структурно CSV) в более чем пятидесяти форматах из многочисленных источников с помощью скрипта Perl. Никогда не ограничивался функциональностью, и хотя он был основан на сценарии, он был достаточно быстр (> 10Klines/sec, где строка была ~ 60-100chars) Я реализовал a) проанализируйте первые несколько сотен строк, перемотайте, а затем выполните прогон .. .создать контекст для логики принятия решений. b) испускать ошибочную строку (строки) с номером строки и контекстом ... поэтому в конце прогона можно отредактировать строки нарушения, затем установить их для повторной установки при последующем запуске, чтобы он мог передавать «исправленные», без ошибок, т. е. каждая строка соответствовала бы формату. c) Разница во времени между линиями ... допускается только увеличение временных меток. d) Также я мог бы переформатировать другие вещи, такие как смены единиц, т.е. имперский в СИ. Хотя из лагеря C простой Perl не слишком чуждо, но сделал это намного проще Примечание. Этот метод может касаться таких проблем, как 10/04/05, т.е. DD/MM/YY или MM/DD/YY, если есть достаточно информации в файле

+0

Приятный, разделить свой код? 10k строк/сек было примерно то, что я имел в виду. Я начал простой компилятор, который принимает до 64 спецификаций формата и испускает код для инкрементного уточнения, поэтому в конце я получаю бит-маску, где бит набора обозначает, что соответствующая спецификация формата хранилась во всем файле. Мог бы сделать с вашим кодом, чтобы проверить мой. – hroptatyr

+0

Если вы получите мне страницу тестовых данных, я могу сбить демонстратора, чтобы облегчить вам путь обучения. Возможно, вы захотите освежить свои регулярные выражения, поскольку это используется для выбора желаемых данных. – Roaker

+0

Я выбрал 6 источников, по 10000 строк. http://qaos.math.tu-berlin.de/~freundt/for_roaker.tar.bz2 – hroptatyr

Смежные вопросы