Пропуск столбцов файла данных

Задача
Файл содержит столбцы, которые следует проигнорировать и не загружать в таблицу.

Решение
Никаких проблем, если эти столбцы – последние. В противном случае перед загрузкой потребуется предварительная обработка файла данных.

Обсуждение
Лишние столбцы, если они расположены последними, не создают трудностей. Если в строке файла больше полей, чем в записи таблицы, то LOAD DATA просто игнорирует их (хотя и может предупредить о наличии несоответствия).

Пропуск столбцов, расположенных в середине, потребует чуть больших усилий. Предположим, вы хотите загрузить информацию из файла паролей UNIX /etc/passwd, который содержит строки такого вида:

account:password:UID:GID:GECOS:directory:shell

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

CREATE TABLE passwd
(
account CHAR(8), # регистрационное имя
uid INT, # ID пользователя
gid INT, # ID группы
gecos CHAR(60), # имя, телефон, офис, и т.п.directory CHAR(60), # домашний каталог
shell CHAR(60) # командный интерпретатор
);

Чтобы загрузить файл, мы должны указать, что разделителем полей служит двоеточие, для этого воспользуемся инструкцией FIELDS:

FIELDS TERMINATED BY ':'

Но надо еще объяснить предложению LOAD DATA, что нужно пропустить второе поле, содержащее пароль.


Это проблематично, так как LOAD DATA всегда загружает столбцы файла подряд. Вы можете определить соответствие столбцов файла столбцам таблицы, но пропустить столбцы в файле не можете. Чтобы справиться с проблемой, преобразуем входной файл в промежуточный, не содержащий столбец с паролями, и загрузим его. В UNIX для этого можно воспользоваться утилитой cut, которая извлечет нужные нам столбцы:

% cut -d":" -f0,3- /etc/passwd > passwd.txt

Опция -d устанавливает разделитель полей, а -f определяет, что надо извлечь первый столбец и все столбцы, начиная с третьего. В результате остается все, кроме второго столбца. (Запустите man cut для получения подробной справки по команде cut.) Теперь воспользуйтесь предложением LOAD DATA для импорта полученного файла passwd.txt в таблицу passwd, например так:

mysql> LOAD DATA LOCAL INFILE 'passwd.txt' INTO TABLE passwd
-> FIELDS TERMINATED BY ':';

Соответствующая команда mysqlimport выглядит так:

% mysqlimport --local --fields-terminated-by=":" cookbook passwd.txt

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Диагностическая утилита для LOAD DATA
Извлечение и перестановка столбцов файлов данных
Импорт XML в MySQL
Импорт с помощью LOAD DATA и утилиты mysqlimport
Импорт файлов в формате CSV

Вернуться в раздел: MySQL / 10. Импорт и экспорт данных