БД загружает CSV в несколько таблиц - PullRequest
2 голосов
/ 25 января 2010

ОБНОВЛЕНИЕ : добавлен пример для уточнения формата данных.

Учитывая CSV с каждой строкой, отформатированной так:

tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,[tbl2.col1:tbl2.col2]+

где [tbl2.col1: tbl2.col2] + означает, что может быть любое количество повторяемых пар

например:

tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2

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

  1. Есть ли способ использовать mysql load data infile для загрузки данных в две отдельные таблицы?
  2. Если нет, то какие инструменты командной строки Unix будет лучше всего подходит для этого?

Ответы [ 2 ]

1 голос
/ 25 января 2010

Как вы говорите, проблемной частью является неизвестное количество пар [tbl2.col1: tbl2.col2], объявленных в каждой строке. Я хотел бы решить это через sed: разделить один файл на два файла, по одному для каждой таблицы. Затем вы можете использовать load data infile для загрузки каждого файла в соответствующую таблицу.

1 голос
/ 25 января 2010

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

Что вы можете сделать, это загрузить данные в промежуточную таблицу, а затем использовать insert into, чтобы выбрать отдельные столбцы в 2 финальных таблицах. вам также может понадобиться substring_index, если вы используете разные разделители для значений tbl2. номер строки обрабатывается автоматически увеличивающимся столбцом в промежуточной таблице (самый простой способ - сделать автоматический столбец последним в определении промежуточной таблицы).

формат не совсем понятен, и лучше всего это делать с perl / php / python, но если вы действительно хотите использовать инструменты оболочки:

cut -d , -f 1-5 file | awk -F, '{print NR "," $0}' > table1

cut -d , -f 6- file | sed 's,\:,\,,g' | \
  awk -F, '{i=1; while (i<=NF) {print NR "," $(i) "," $(i+1); i+=2;}}' > table2

при этом создаются файлы таблиц 1 и 2 со следующим содержимым:

1,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5
2,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5
3,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5

и

1,tbl2.col1,tbl2.col2
1,tbl2.col1,tbl2.col2
2,tbl2.col1,tbl2.col2
2,tbl2.col1,tbl2.col2
3,tbl2.col1,tbl2.col2
3,tbl2.col1,tbl2.col2
...