2009-07-28 2 views
0

У меня есть текстовые файлы с множеством одинаковых строк, которые я бы хотел загрузить в базу данных mysql, но файлы не полностью однородны. В начале есть несколько строк для некоторой различной информации, и есть временные метки примерно каждые 6 строк.Загрузите неравномерные данные из txt-файла в базу данных msql

«LOAD DATA INFILE» не похоже на ответ здесь из-за моего формата файла. Это не кажется достаточно гибким.

Примечание: заголовок файла занимает предопределенное количество строк. Временная метка предикативна, но есть и другие случайные заметки, которые могут появиться, что нужно игнорировать. Они всегда начинаются с нескольких ключевых слов, которые я могу проверить.

Образец моего файла в середине:

103.3  .00035 
    103.4  .00035 
    103.5  .00035 
    103.6  .00035 
    103.7  .00035 
    103.8  .00035 
    103.9  .00035 
Time: 07-15-2009 13:37 
    104.0  .00035 
    104.1  .00035 
    104.2  .00035 
    104.3  .00035 
    104.4  .00035 
    104.5  .00035 
    104.6  .00035 
    104.7  .00035 
    104.8  .00035 
    104.9  .00035 
Time: 07-15-2009 13:38 
    105.0  .00035 
    105.1  .00035 
    105.2  .00035 

От этого мне нужно загрузить информацию на три поля. Первым полем должно быть имя файла, а другое - в примере. Я мог бы добавить имя файла перед каждой линией данных, но это может быть необязательно, если я использую скрипт для загрузки данных.

При необходимости я могу изменить формат файла, но я не хочу потерять информацию о времени и заголовке.

SQLAlchemy кажется хорошим выбором для python, с которым я довольно хорошо знаком.

У меня есть тысячи строк данных, поэтому загрузка всех моих файлов, которые у меня уже есть, может быть медленной сначала, но потом я просто хочу загрузить в новые строки файла. Итак, мне нужно будет выбирать, что я загружаю, потому что я не хочу дублировать информацию.

Любые предложения по методу выборочной загрузки данных из текстового файла в базу данных mysql? И помимо этого, что вы предлагаете для загрузки только в строках файла, которые еще не находятся в базе данных?

Спасибо всем. Между тем, я рассмотрю SQLAlchemy немного больше и посмотрю, смогу ли я где-нибудь с этим справиться.

ответ

2

LOAD DATA INFILE имеет опцию IGNORE LINES, которую вы можете использовать для пропуска заголовка. Согласно the docs, у него также есть опция «LINES STARTING BY» prefix_string », которую вы можете использовать, поскольку все ваши линии данных, похоже, начинаются с двух пробелов, в то время как ваши метки времени начинаются в начале строки.

+0

Это может работать для загрузки файла в первый раз, но как бы вы прочитали только последние несколько строк для обновления базы данных? – mouche

+0

Используйте IGNORE LINES? – oggy

2

Другой способ сделать это - просто преобразовать файлы Python для вас. Вы могли бы фильтровать входной файл в выходной файл на основе критериев, которые вы указали довольно легко. Этот код предполагает, что у вас есть некоторая функция is_data (строка), которая проверяет строку для указанных вами критериев и возвращает true, если это данные.

with file("output", "w") as out: 
    for line in file("input"): 
    if is_data(line): 
     out.write(line) 

Кроме того, если файлы просто продолжать Concat вы могли бы его хранить и читать последний записанное смещение (этот код не может быть 100% право, я не проверял. Но вы получите идею) :

if os.path.exists("filter_settings.txt"): 
    start=long(file("filter_settings.txt").read()) 
else: 
    start=0 

with file("output", "w") as out: 
    input = file("input") 
    input.seek(start) 
    for line in input: 
    if is_data(line): 
     out.write(line) 
    file("filter_settings.txt", "w").write(input.tell()) 
+0

Спасибо за пример кода. Возможно, python i/o - хороший способ пойти. Я собираюсь изучить этот последний фрагмент. Я продолжаю добавлять данные в конец моих файлов. – mouche

+1

+1: Труба из двух частей.Python преобразуется в «чистую» форму. MySQL для загрузки. Пробег быстрее разбивается таким образом. И у вас есть большой контроль над фильтрацией, не пытаясь попотеть SQL-материал. –