Используйте mysqlimport с подмножеством столбцов файла

#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 over sed ? Это быстрее?

5. Вам не нужно писать регулярные выражения, если вы используете cut . Например, для печати полей 1,2,10, разделенных запятыми: cut -d, -f1,2,10 Прочитайте man cut для получения дополнительной информации.