Передача данных из Excel в БД MySQL Server? - PullRequest
1 голос
/ 13 июня 2011

У меня есть довольно сложный лист Excel, в котором столбцы начинаются с А и заканчиваются на ВВ, а строки начинаются с 5 и заканчиваются на 203.

Что я хотел бы сделать, это сказать MySQL, что каждый столбец данных(с заголовком, который я не указываю на листе) должен начинаться со строки 5 и заканчиваться строкой 203 и конкретно указывать, какие столбцы я хотел бы перенести.Как я могу это сделать?

Спасибо за помощь!

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

1 Ответ

1 голос
/ 13 июня 2011

Прежде всего, сохраните свой лист Excel как CSV.

Далее.Создайте таблицу чёрных дыр для чтения данных в:

DROP TABLE IF EXISTS `test`.`import_excel`;
CREATE TABLE  `test`.`import_excel` (
  `A` int(10) unsigned NOT NULL,
  `B` varchar(45) NOT NULL,
  `C` varchar(45) NOT NULL,
  `D` varchar(45) NOT NULL,
  `E` varchar(45) NOT NULL,
  .....
  `BB` varchar(45) NOT NULL
) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1;

Создайте простую таблицу счетчиков с одной строкой.

DROP TABLE IF EXISTS `test`.`counter`;
CREATE TABLE  `test`.`counter` (
  id int(10) unsigned NOT NULL PRIMARY KEY,
  `count` int(10) unsigned NOT NULL,
  `max_count` int(10) unsigned NOT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1;

REPLACE INTO counter VALUES (1,0,(203-5));

Создайте триггер на таблице чёрных дыр

DELIMITER $$

CREATE TRIGGER ai_import_excel_each AFTER INSERT ON import_excel FOR EACH ROW
BEGIN
  DECLARE rows_left integer;

  SELECT max_count - (`count` + 1)  INTO rows_left FROM counter WHERE id = 1;
  IF rows_left > 0 THEN BEGIN
    //count the row_number you're in.
    UPDATE counter SET `count` = `count` + 1 WHERE id = 1;

    //Interpret the data and insert it into the proper tables.
    //This is just an example
    INSERT INTO real_table (a,b,c) VALUES (new.a, new.b, new.c);
    INSERT INTO real_table2 (a,b,c) VALUES (NULLIF(new.d,''), new.e, new.c);
    //You can change the data in anyway you like.
  END; END IF;
END $$

DELIMITER ;

Наконец, импортируйте строки с 5 по 203. В таблицу import_excel.

LOAD DATA INFILE 'c:/excel.csv' INTO TABLE import_excel 
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\r\n'
  IGNORE 4 LINES;

Первые 4 строки будут игнорироваться LOAD DATA INFILE, последние строки будут удалены триггером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...