#mysql #linux #bash #mysqlimport
#mysql #linux #bash #mysqlimport
Вопрос:
У меня есть файл, скажем, data.csv
, который поступает на мой сервер, и который я хочу импортировать в data
таблицу в базе данных MySQL с помощью mysqlimport
.
Моя проблема в том, что в этом файле намного больше данных, чем я на самом деле хочу импортировать. Он использовался другим сервером до меня, которому нужны все эти данные, но мне нужно только несколько столбцов из него.
Есть ли способ указать, какие столбцы я хочу mysqlimport
использовать?
Я думал, что это будет выглядеть примерно так
mysqlimport --columns="field_1","field_2","field_42","field_31","field_16","field_4" db data.csv
но вместо этого таблица содержит только первые 6 полей файла. При необходимости я могу переставить таблицу так, чтобы нужные мне поля были в порядке (т. Е. я был бы запущен --columns="field_1","field_2","field_4","field_16",...
).
Я смутно осознаю, что это можно было бы сделать с помощью sed
, но мне любопытно, mysqlimport
поддерживает ли это изначально?
РЕДАКТИРОВАТЬ: Принятый ответ не совсем то, на что я надеялся, но я думаю, что ответ таков: «нет, к сожалению, он это не поддерживает». В любом случае, ознакомьтесь с принятым ответом и комментариями для поиска обходных путей!
Ответ №1:
--columns
Опция не присваивает имена столбцам входного файла. Он присваивает имена столбцам целевой таблицы, в которую вы импортируете. Все поля входного файла должны куда-то деваться. У вас должно быть столько столбцов в --columns
, сколько полей входного файла.
Но не все поля входного файла должны помещаться в столбцы вашей таблицы.
Да?
Вот трюк (это тоже работает в LOAD DATA INFILE
): Вы можете «отправить» поля ввода либо в реальный столбец вашей таблицы, либо в переменную сеанса. Эта переменная будет просто перезаписываться каждой строкой, вводимой из вашего файла, но это не имеет значения. Думайте об этом как о фиктивной переменной в проекте code.
Пример: Я создал таблицу с тремя столбцами.
mysql> create table mytable (one text, two text, four text);
Я создал входной текстовый файл с четырьмя полями.
$ cat mytable.csv
one,two,three,four
Здесь я импортирую поля в соответствующие столбцы, пропуская третье поле, помещая его в фиктивную переменную.
$ mysqlimport --local --columns one,two,@dummy,four --fields-terminated-by=, test mytable.csv
Успех!
mysql> select * from mytable;
------ ------ ------
| one | two | four |
------ ------ ------
| one | two | four |
------ ------ ------
Комментарии:
1. Интересно, это, безусловно, могло бы быть полезно, но входные данные содержат 52 столбца, поэтому было бы неэлегантно указывать ~ 45 столбцов
@dummy
… Есть ли способ, скажем, отправить несколько столбцов из входных данных в эту@dummy
переменную? Нравится--columns one,two,@dummy*7,ten
2. Вам пришлось бы использовать
one,two,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,ten
. Если вам это не нравится, подготовьте входной файл, содержащий правильные столбцы. Я бы использовал Sed не самый лучший инструмент для этогоcut
.3. Должно быть ясно, что в имени переменной нет ничего особенного
@dummy
. Вы могли бы использовать@d
или что-нибудь еще, что захотите.4. Спасибо за все эти советы! Да, я думаю, что лучше всего было бы просто стиснуть зубы и подготовить другой файл. Интересно, почему
cut
oversed
? Это быстрее?5. Вам не нужно писать регулярные выражения, если вы используете
cut
. Например, для печати полей 1,2,10, разделенных запятыми:cut -d, -f1,2,10
Прочитайтеman cut
для получения дополнительной информации.