Как импортировать файл CSV в таблицу MySQL?

306

У меня есть ненормализованный дневник событий 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 записей. Первая строка содержит имена столбцов. Я думаю, что это разделены запятыми, а текст, очевидно, разделены двойной кавычкой.

ОБНОВИТЬ:

Если вы сомневаетесь, прочитайте руководство: 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записей, и ни одна из загруженных данных, кажется, не в нужном месте.

Иэн Сэмюэл Маклин Старейшина
источник
17
А если у вас OSX, у Sequel Pro есть отличный инструмент для импорта, и он БЕСПЛАТНЫЙ ;-)
Merrick
41
Мне удивительно, что оригинальный постер ответил на свой собственный вопрос лучше, чем кто-либо другой ... Я не знаю, почему так много людей готовы давать рекомендации по программному обеспечению, когда существует существующая команда SQL, которая может быть программной, а не пользовательским интерфейсом -исходя из. Я не знаю ни о ком другом, но программно для меня это означает, что у меня могут быть настроены скрипты для автоматического импорта файлов по временным меткам, тогда как на основе пользовательского интерфейса это чисто ручной.
Крис Cirefice
@ChrisCirefice: я думаю, что принятый ответ это хорошо объясняет. Ему нужна была помощь, чтобы вручную создать команду «загрузить данные», с которой может помочь графическая программа. После того, как графическая программа создала команду «загрузить данные», он мог затем повторно использовать ее программно.
AlexC
@ Меррик, это сработало на osx
weaveoftheride
Я написал обширное руководство по загрузке данных CSV в MySQL вместе с генератором синтаксиса в Excel .
mysql_user

Ответы:

133

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

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

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

Импортировать текстовый файл

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

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

введите описание изображения здесь

Пекка
источник
25
Для Mac OSX используйте Sequel Pro.
Agi Hammerthief
3
Я только что попробовал, и мне нужно сначала создать таблицу ... вместо того, чтобы использовать имена столбцов.
Доминик
3
Вы должны выбрать стол прежде, чем сможете продолжить ... и поскольку весь смысл не в том, чтобы составить стол ...
Доминик
3
Обратите внимание, что в Linux HeidiSQL очень хорошо работает под Wine.
АлехандроВД
1
@Paul сам смысл ответа в том, что инструменты GUI могут упростить сопоставление столбцов импорта с столбцами таблицы.
Пекка
191

Используйте 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'

michalzuber
источник
6
mysqlimportиспользуется LOAD DATA INFILE...за кулисами, так что это почти то же самое.
Младен Ябланович
8
Как и в случае LOAD DATA INFILE, вам нужно создать таблицу, прежде чем вы сможете использовать mysqlimport.
Маркус Даунинг
@ MladenJablanović, это определенно не одно и то же. Попробуйте импортировать строки 1bil. Вы будете удивлены, какая
огромная
@ninjabber В документации говорится, что клиент mysqlimport предоставляет интерфейс командной строки для НАГРУЗКИ ДАННЫХ INFILE , поэтому теоретически невозможно предложить какое-либо преимущество в производительности по сравнению с LOAD DATA INFILE.
Младен Ябланович
1
также нужно --fields-optionally-enclosed-by=\"и `--fields-escaped-by = \`
chaintng
80

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

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

вот данные .csvCSV FILE

вот команда:

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

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

Смельчак
источник
1
',' -> '\ t', '"' -> '' в случае файлов TSV и удалить последнюю строку, если заголовок отсутствует. (Надеемся, что поисковые роботы проиндексировали это).
Bleeding Fingers
16
Если это локальный файл, вам может понадобиться LOAD DATA LOCAL INFILE. Если это приводит к ошибке 1148 «используемая команда не разрешена», вы можете включить ее, запустив mysql в командной строке с --local-infile.
Big McLargeHuge
я получил ошибку: ОШИБКА 1045 (28000): доступ запрещен для пользователя 'user' @ '%' (используется пароль: YES)
ARUNBALAN NV
Вы должны предоставить пользователю все права доступа из админ-панели, затем попробуйте импортировать скрипт.
DareDevil
1
Я получаю эту ошибку: MySQL-сервер работает с опцией --secure-file-priv, поэтому он не может выполнить этот оператор
Agniswar Bakshi
66

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

Я использовал этот метод для импорта более 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);
Fahad
источник
Я импортировал 16 тысяч строк и 48 столбцов. Спасибо, приятель.
Renjith VR
Это лучшее решение. Для всех, кому интересно, как быстро это происходит: я импортировал 3,2 миллиона строк менее чем за 14 секунд на экземпляре AWS Lightsail за 20 долларов в месяц с встроенным сервером MySQL (не высокопроизводительной RDS). Потрясающие!
master_gracey
В этой строке (field_1,field_2 , field_3);это относится к списку столбцов в файле .csv или в таблице? т.е. что это за поля?
tera_789
@ tera_789 Те, что в вашем CSV-файле, вероятно, будут соответствовать вашему столу
Фахад
Должен следовать формату данных. пример (для моего случая) <pre> first_name, last_name, dob, phone_number, электронная почта, имя, фамилия, 12-05-2018,54545, faiz @ gmail.com, name1, lastName1,2018-05-12,456, faiz1 @ gmail .com, name2, lastName2,2018-05-12,456, faiz2 @ gmail.com, name3, lastName3,2018-05-22,456, faiz3 @ gmail.com, name4, lastName4,1988-05-22,456, faiz4 @ gmail.com , name5, lastName5,1988-05-22,456, faiz5 @ gmail.com, name6, lastName6,1987-05-21,456, faiz6 @ gmail.com </ pre>
Фаиз Ахмед
32

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

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

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

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

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

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

  6. Перейдите к файлу CSV.

  7. Выберите опцию «CSV используя LOAD DATA».

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

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

  10. Нажмите кнопку Go, и все готово.

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

Фархан
источник
Это хорошо и просто. Я предпочитаю создавать таблицы и столбцы с помощью SQL (поэтому я пропускаю шаг № 9) и вставлять данные через импорт CSV. Не забудьте установить NULLв CSV для любых автоинкрементных полей / столбцов.
серебро
Обратите внимание, что phpMyAdmin терпит неудачу, когда кириллические символы включены в файл CSV, независимо от того, говорите ли вы использовать utf-8.
Фран Марзоа
Не забудьте изменить размер импорта, если вы импортируете большой файл CSV. Кстати, это не хороший вариант для больших файлов CSV.
Ави
Для этого необходимо сначала загрузить файл .csv в веб-клиент, поскольку вы не можете найти локальный файл csv.
Маккензм
Да, вы можете, вам нужно установить флажок «Локальное
ключевое
12

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

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

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

lafncow
источник
8

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

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

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

Дэвид
источник
Это лучший ответ. Зачем использовать другой инструмент, если подойдет одна команда SQL?
sdgfsdh
Знаете ли вы, как заставить это работать, когда вы пытаетесь загрузить файл в mysql, работающий на сервере? Он запрашивает у меня доступ к файлу (пароль). Где ввести пароль для размещения файла CSV?
Бактаавар
7

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

  • используйте Excel для редактирования имен заголовков без пробелов
  • сохранить как .csv
  • используйте бесплатный Navicat Lite Sql Browser для импорта и автоматического создания новой таблицы (дайте ей имя)
  • откройте новую таблицу, вставьте основной номер автоколонны для ID
  • измените тип столбцов по желанию.
  • сделано!
user1464271
источник
5

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

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

введите описание изображения здесь

Виталий Пак
источник
+1. Я использовал это, потому что mysql продолжал давать мне ошибки для LOAD DATA INFILEи mysqlimport(«это не поддерживается в этой версии mysql»)
clmno
Этот метод работает, но он довольно медленный. Я бы подумал, что использование этой функции создало бы массивный INSERTзапрос и попытался бы выполнить все сразу, но похоже, что выполнение этого способа фактически выполняется один раз INSERTв строке.
DaveTheMinion
4

Я вижу что-то странное. Вы используете для 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 и не найдете, какой персонаж использует для побега. Иногда это «\». Но если у вас его нет, не используйте его.

Juan
источник
3

Еще одно решение - использовать инструмент csvsql из потрясающего пакета csvkit .

Пример использования:

csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file

Этот инструмент может автоматически выводить типы данных (поведение по умолчанию), создавать таблицы и вставлять данные в созданную таблицу. --overwriteопция может быть использована для удаления таблицы, если она уже существует. --insertопция - заполнить таблицу из файла.

Чтобы установить пакет

pip install csvkit

Необходимые условия: python-dev , libmysqlclient-dev,MySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python
Рувим
источник
3

Как импортировать CSV-файлы в таблицы SQL

Файл примера: файл Overseas_trade_indexданных CSV

шаги:

  1. Нужно создать таблицу для overseas_trade_index.

  2. Необходимо создать столбцы, связанные с CSV-файла.

    SQL-запрос:

    ( id int not null primary key auto_increment,
    series_reference varchar (60),
    period varchar (60),
    data_value decimal(60,0),
    status varchar (60),
    units varchar (60),
    magnitude int(60),
    subject text(60),
    group text(60),
    series_title_1 varchar (60),
    series_title_2 varchar (60),
    series_title_3 varchar (60),
    series_title_4 varchar (60),
    series_title_5 varchar (60),
     );
  3. Необходимо подключить базу данных MySQL в терминале.

    =>show databases;
    =>use database;
    =>show tables;
  4. Пожалуйста, введите эту команду для импорта данных CSV в таблицы MySQL.

    load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);
  5. Найти эти данные по внешнему торговому индексу в базе данных sqld:

    select * from trade_index;
Сивамани
источник
2

Если вы используете Windows-машину с загруженной электронной таблицей Excel, новый плагин mySql для Excel просто феноменален. Люди в Oracle действительно хорошо поработали над этим программным обеспечением. Вы можете установить соединение с базой данных непосредственно из Excel. Этот плагин будет анализировать ваши данные и составлять таблицы для вас в формате, совместимом с данными. У меня были огромные CSV-файлы данных для конвертации. Этот инструмент сэкономил много времени.

http://dev.mysql.com/downloads/windows/excel/

Вы можете вносить обновления в Excel, которые будут заполнять базу данных онлайн. Это очень хорошо работало с файлами mySql, созданными на ультра-недорогом хостинге GoDaddy. (Обратите внимание, что когда вы создаете таблицу в GoDaddy, вам нужно выбрать некоторые нестандартные настройки, чтобы разрешить внешний доступ к базе данных ...)

С этим плагином у вас есть чистая интерактивность между вашей электронной таблицей XL и онлайн-хранилищем данных mySql.

zipzit
источник
2

Я использую MySQL верстак, чтобы сделать ту же работу.

  1. создать новую схему
  2. открыть вновь созданную схему
  3. щелкните правой кнопкой мыши «Таблицы» и выберите «Мастер импорта табличных данных»
  4. укажите путь к файлу csv и имя таблицы и, наконец, настройте тип столбца, поскольку мастер устанавливает тип столбца по умолчанию на основе их значений.

Примечание: посмотрите на файл журнала mysql workbench на наличие ошибок, используя "tail -f [mysqlworkbenchpath] /log/wb*.log"

Мехди
источник
Большое спасибо за ваш ответ - будучи новичком в MySQL, я не знал об этом - он помог мне с CSV. Теперь мне также нужно импортировать 10 таблиц из Access. Как вы думаете, самый простой способ - экспортировать эти таблицы в Excel, из Excel в CSV и затем использовать эти шаги?
Наоми
Я обнаружил, что этот метод не импортирует все строки :( Из 5 342 строк он импортировал для меня только 2485 строк. Почему это так?
Наоми
Привет, Наоми, если ты проверишь журнал mysqlworkbench, он покажет тебе, почему он прекратил импорт данных. У вас могут быть некоторые нулевые значения или тип несоответствия в вашем файле DB и CSV. Но я настоятельно рекомендую следовать ответу Хуана (сразу после меня). Его решение лучше и чище, чем у меня.
Мехди
1

Вот пример снимка экрана файла Excel:

введите описание изображения здесь

Сохраните как и выберите .csv.

И у вас будет, как показано ниже, снимок экрана .csv, если вы откроете его с помощью notepad ++ или любого другого блокнота.

введите описание изображения здесь

Убедитесь, что вы удалили заголовок и выравнивание столбцов в .csv, как в MySQL таблицы. Замените имя_папки на имя папки

ЗАГРУЗИТЬ ДАННЫЙ ЛОКАЛЬНЫЙ ИНФИЛЬ
'D: /folder_name/myfilename.csv' В СТОЛОВЫЕ ПОЧТОВЫЕ ПОЛЯ, ПРЕКРАЩАЕМЫЕ ',' (fname, lname, email, phone);

Если большие данные, вы можете взять кофе и загрузить его!

Это все, что вам нужно.

Мэджи Дэниел
источник
0

PHP-запрос для импорта файла CSV в базу данных MySQL

$query = <<<EOF
            LOAD DATA LOCAL INFILE '$file'
             INTO TABLE users
             FIELDS TERMINATED BY ','
             LINES TERMINATED BY '\n'
             IGNORE 1 LINES
            (name,mobile,email)
    EOF;
if (!$result = mysqli_query($this->db, $query))
   {
        exit(mysqli_error($this->db));
   }

** Пример данных CSV-файла **

name,mobile,email
Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus
Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
Craig White,516-795-8065,CraigJWhite@inbound.plus
David Whitney,713-214-3966,DavidCWhitney@inbound.plus
Суварнакумар Канапатипиллаи
источник
0

Измените имя сервера, имя пользователя, пароль, имя базы данных, путь к вашему файлу, имя таблицы и поле, которое находится в вашей базе данных, которую вы хотите вставить

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "bd_dashboard";
    //For create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    $query = "LOAD DATA LOCAL INFILE 
                'C:/Users/lenovo/Desktop/my_data.csv'
                INTO TABLE test_tab
                FIELDS TERMINATED BY ','
                LINES TERMINATED BY '\n'
                IGNORE 1 LINES
                (name,mob)";
    if (!$result = mysqli_query($conn, $query)){
        echo '<script>alert("Oops... Some Error occured.");</script>';
        exit();
            //exit(mysqli_error());
       }else{
        echo '<script>alert("Data Inserted Successfully.");</script>'
       }
    ?>
Srikrushna
источник