Как импортировать файл CSV в таблицу MySQL - PullRequest
271 голосов
/ 03 сентября 2010

У меня есть ненормализованный дневник событий CSV от клиента, который я пытаюсь загрузить в таблицу MySQL, чтобы я мог выполнить рефакторинг в нормальном формате. Я создал таблицу с именем «CSVImport», в которой есть одно поле для каждого столбца файла CSV. CSV содержит 99 столбцов, так что сама по себе эта задача была достаточно сложной:

CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);

Никаких ограничений на таблицу нет, и все поля содержат значения VARCHAR (256), кроме столбцов, которые содержат счетчики (представленные как INT), да / нет (представленные как BIT), цены (представленные как DECIMAL), и текстовые пометки (представлены ТЕКСТОМ).

Я пытался загрузить данные в файл:

LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023  Deleted: 0  Skipped: 0  Warnings: 198256
SELECT * FROM CSVImport;
| NULL             | NULL        | NULL           | NULL | NULL               | 
...

Вся таблица заполнена NULL.

Мне кажется, проблема в том, что текстовые пометки содержат более одной строки, а MySQL анализирует файл так, как если бы каждая новая строка соответствовала одной строке базы данных. Я могу загрузить файл в OpenOffice без проблем.

Файл clientdata.csv содержит 2593 строки и 570 записей. Первая строка содержит имена столбцов. Я думаю, что он разделен запятыми, а текст, очевидно, разделен двойной кавычкой.

UPDATE:

Если сомневаетесь, прочитайте инструкцию: http://dev.mysql.com/doc/refman/5.0/en/load-data.html

Я добавил в оператор LOAD DATA некоторую информацию о том, что OpenOffice был достаточно умен, чтобы сделать вывод, и теперь он загружает правильное количество записей:

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Но все же есть много полностью NULL записей, и ни одна из загруженных данных, кажется, не в нужном месте.

Ответы [ 19 ]

177 голосов
/ 12 июня 2013

Используйте mysqlimport для загрузки таблицы в базу данных:

mysqlimport --ignore-lines=1 \
            --fields-terminated-by=, \
            --local -u root \
            -p Database \
             TableName.csv

Я нашел это в http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/

Чтобы сделать разделитель вкладкой, используйте --fields-terminated-by='\t'

120 голосов
/ 03 сентября 2010

Кажется, суть вашей проблемы - сопоставление столбцов в CSV-файле с столбцами в таблице.

Многие графические клиенты MySQL имеют очень хорошие диалоги импорта для такого рода вещей.

Моя любимая работа - Windows HeidiSQL . Он дает вам графический интерфейс для построения команды LOAD DATA; Вы можете повторно использовать его программно позже.

Import textfile

Снимок экрана: диалоговое окно "Импорт текстового файла"

Чтобы открыть диалоговое окно «Импорт текстового файла», перейдите на Tools > Import CSV file:

enter image description here

76 голосов
/ 11 июня 2014

Самый простой способ, которым я импортировал 200+ строк, находится ниже команды в окне phpmyadmin sql

У меня есть простая таблица страны с двумя столбцами CountryId, CountryName

вот данные .csv CSV FILE

вот команда:

LOAD DATA INFILE 'c:/country.csv' 
INTO TABLE country 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS

Помните одну вещь, никогда не появляйтесь во втором столбце, иначе ваш импорт остановится

59 голосов
/ 21 марта 2017

Я знаю, что вопрос старый , но я бы хотел поделиться этим

I Этот метод использовался для импорта более 100 КБ записей ( ~ 5 МБ ) за 0,046сек

Вот как вы это делаете:

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

Очень важно включить последнюю строку, если у вас более одного поля, т.е. обычно оно пропускает последнее поле (MySQL 5.6.17)

LINES TERMINATED BY '\n'
(field_1,field_2 , field_3);

Затем, если у вас есть первая строка в качестве заголовка для ваших полей, вы можете включить эту строку также

IGNORE 1 ROWS

Вот как это выглядит, если в вашем файле есть строка заголовка.

LOAD DATA LOCAL INFILE  
'c:/temp/some-file.csv'
INTO TABLE your_awesome_table  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(field_1,field_2 , field_3);
25 голосов
/ 14 мая 2014

phpMyAdmin может обрабатывать импорт CSV. Вот шаги:

  1. Подготовьте файл CSV, чтобы поля были в том же порядке, что и поля таблицы MySQL.

  2. Удалить строку заголовка из CSV (если есть), чтобы в файле были только данные.

  3. Перейдите в интерфейс phpMyAdmin.

  4. Выберите таблицу в левом меню.

  5. Нажмите кнопку импорта вверху.

  6. Просмотр файла CSV.

  7. Выберите опцию «CSV с использованием LOAD DATA».

  8. Введите "," в "полях, оканчивающихся на".

  9. Введите имена столбцов в том же порядке, что и в таблице базы данных.

  10. Нажмите кнопку "Перейти", и все готово.

Это примечание, которое я подготовил для своего будущего использования, и делюсь здесь, если кто-то еще может извлечь выгоду.

11 голосов
/ 30 декабря 2014

Это можно исправить, перечислив столбцы в операторе LOAD DATA. Из руководства :

LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);

... так что в вашем случае вам нужно перечислить 99 столбцов в том порядке, в котором они появляются в CSV-файле.

7 голосов
/ 25 сентября 2012

В командной строке mysql слишком много проблем при импорте.Вот как вы это делаете:

  • используйте Excel для редактирования имен заголовков без пробелов
  • сохраните как .csv
  • используйте бесплатный Navicat Lite Sql Browser дляимпорт и автоматическое создание новой таблицы (присвойте ей имя)
  • откройте новую таблицу и вставьте основной столбец автоматического номера для идентификатора
  • измените тип столбцов по своему усмотрению.
  • готово!
6 голосов
/ 16 августа 2017

Попробуйте, у меня это сработало

    LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;

IGNORE 1 ROWS здесь игнорирует первую строку, которая содержит имена полей.Обратите внимание, что для имени файла вы должны ввести абсолютный путь к файлу.

4 голосов
/ 24 мая 2018

Если вы используете MySQL Workbench (в настоящее время версия 6.3), вы можете сделать это:

  1. Щелкните правой кнопкой мыши "Таблицы";
  2. Мастер выбора таблицы данных;
  3. Выберите ваш CSV-файл и следуйте инструкциям (также может использоваться JSON); Хорошо, что вы можете создать новую таблицу на основе файла CSV, который вы хотите импортировать или загрузить данные в существующую таблицу

enter image description here

3 голосов
/ 17 декабря 2018

Я вижу что-то странное.Вы используете для ESCAPING тот же символ, который вы используете для ENCLOSING.Так что движок не знает, что делать, когда он находит «», и я думаю, что именно поэтому, кажется, что ничего не в нужном месте. Я думаю, что если вы удалите строку ESCAPING, он должен работать отлично.*

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Если вы не проанализируете (вручную, визуально, ...) свой CSV и не найдете, какой персонаж использует для побега. Иногда это '\'. Но если у вас его нет, не используйте его.

...