Как объединить данные из двух CSV файлов

Опубликовал Black Hat в блоге Блог Black Hat. Просмотров: 40

Встала задача:
  • есть список регионов России с "каноничными" названиями (name) в формате CSV
  • есть список email, отвечающий за регион (name, email) в формате CSV
  • нужно объединить оба списка, проблема в том, что названия немного различаться (где-то Республика Чувашия, где-то просто Чувашия)
Идея такая:
  • загружаем данные в две отдельные таблицы
  • обновляем таблицу "регионы" и выводим строки, которые неудачно обновились (проблема: "Республика Чувашия" и "Чувашия")
  • корректируем файл с email, исправляя названия
Код:
SET NAMES utf8;

-- создаем таблицу регионы
DROP TABLE IF EXISTS `regions`;
CREATE TABLE `regions` (
`name` varchar(255) NOT NULL,
`email` varchar(512) NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- загружаем данные о регионах
LOAD DATA INFILE '/tmp/regions.csv' INTO TABLE `regions` CHARACTER SET UTF8 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

-- создаем таблицу email адресов
DROP TABLE IF EXISTS `mails`;
CREATE TABLE `mails` (
`name` varchar(255) NOT NULL,
`email` varchar(512) NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- загружаем данные email адресов
LOAD DATA INFILE '/tmp/mail.csv' INTO TABLE `mails` CHARACTER SET UTF8 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

-- обновляем регионы
UPDATE `regions`
JOIN `mails` ON mails.name = regions.name
SET regions.email = mails.email;

-- ищем в регионах, где email не обновился
SELECT * FROM regions WHERE email = "";
Все что выше удобно оформить в файл load.sql и запустить:
Код:
mysql test < load.sql
У меня возникла такая ошибка:

Код:
name    email
Республика Беларусь
Теперь в файле mail.csv нужно найти "Беларусь" и исправить ее на "Республика Беларусь", после чего заново запустить этот скрипт.

Таким способом можно совмещать удобство редактирования файлов и мощность базы данных.

В моем втором блоге я пишу ответы на вопросы по ускорению сайтов, стараясь обходить технические особенности. Если вам интересна тема, пишите комменты :)
Необходима авторизация