2012-06-10 2 views
0

У меня есть многочисленные файлы csv, которые будут служить основой базы данных mysql. Моя проблема заключается в следующем:Как загружать столбцы CSV в таблицу MySQL

Входные CSV файлы имеют формат:

ВРЕМЯ | VALUE PARAM 1 | VALUE PARAM 2 | VALUE PARAM 3 | И Т.П.
0.00001 | 10 | 20 | 30 | и т. д.

Это не та структура, которую я хочу использовать в базе данных. Там я хотел бы один большой стол для всех данных, структурированных что-то вроде:

ВРЕМЯ | ПАРАМЕТР | VALUE | Единица измерения | Версия

Это означает, что я хотел бы вставить комбинацию TIME и VALUE PARAM 1 из CSV в таблицу, затем комбинацию TIME и VALUE PARAM 2 и т. Д. И т. Д.

Я раньше не делал ничего подобного, но могло ли быть возможным решение создать скрипт BASH, который будет проходить через столбцы, и на каждой итерации вставляет комбинацию времени + значение в мою базу данных?

У меня есть разумное понимание mysql, но очень ограниченное знание bash-скриптов. Но я не мог найти выход с командой mysql LOAD DATA INFILE.

Если вам нужна дополнительная информация, чтобы помочь мне, я рад предоставить дополнительную информацию!

С уважением,

Erik

ответ

1

я делать это весь день, каждый день, и, как правило, имеют наибольший успех с наименьшими головные боли с помощью INFILE LOAD DATA во временную таблицу, затем усиливая мощью mySQL, чтобы получить его в финальной таблице/формате. Подробности на странице this answer.

Чтобы проиллюстрировать это дальше, мы обрабатываем файлы для каждого видео случае 80K/колледжей ВУЗы по всей стране войти (это каждый пауза/воспроизведение/искать/стоп/старт для 100 тысяч видео).

Они обслуживаются с разных серверов, в зависимости от типа видео (WMV, FLV, MP4 и т. Д.), Поэтому каждый день приходится обрабатывать около 200 ГБ, причем каждый формат имеет разную структуру журнала. Старый способ, которым мы это делали с CSV/PHP, занял буквально дни, чтобы закончить, но изменив его на LOAD DATA INFILE во временные таблицы, объединив их во вторую стандартизованную временную таблицу, а затем используя SQL для группировки и в противном случае срез и кубики вырезали выполнение время до нескольких часов.

+0

Спасибо, Грег, я рассмотрю это. Думаю, мне все равно нужно было бы перебирать столбцы, но теперь в таблице temp. Это должно быть возможно при правильной процедуре? – user1447470

+0

Да ... чистый эффект от этого заключается в том, что у вас есть необработанные данные в гораздо более управляемом формате, которые вы можете проверять и манипулировать с гораздо большей легкостью и точностью. Контурные/сохранение/и т.д.. будет в конечном счете зависеть от того, что вы хотите для готового продукта. Надеюсь, это поможет, и вы ответите «Я». – GDP

1

Возможно, было бы проще предварительно обработать ваш CSV с помощью сценария awk, а затем (как сказал Грег П.) использовать LOAD DATA LOCAL INFILE.Если я правильно понимаю ваши требования правильно, это AWK скрипт должен работать:

#!/usr/bin/awk -F| -f 

NR==1 { 
    for(col = 2; col <= NF; col++) label[col] = $col 
    printf("TIME | PARAM | VALUE | UNIT | VERSION\n") 
    next 
} 

{ 
    for(col = 2; col <= NF; col++) { 
     printf("%s | %s | %s | [unit] | [version]\n", $1, label[col], $col) 
    } 
} 

Выход:

$ ./test.awk test.in 
TIME | PARAM | VALUE | UNIT | VERSION 
0.00001 | VALUE PARAM 1 | 10 | [unit] | [version] 
0.00001 | VALUE PARAM 2 | 20 | [unit] | [version] 
0.00001 | VALUE PARAM 3 | 30 | [unit] | [version] 
0.00001 | ETC. | etc. | [unit] | [version] 

Тогда

mysql> LOAD DATA LOCAL INFILE 'processed.csv' 
mysql> INTO TABLE 'table' 
mysql> FIELDS TERMINATED BY '|' 
mysql> IGNORE 1 LINES; 

(Примечание: Я не тестировал MySQL)

+0

Спасибо, Кевин! Это должно сработать. Я предполагаю (как сказал Грег), у вас есть немного больше сырых данных из временной таблицы. Но оба подхода - это то, что я искал. – user1447470

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