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

у меня есть ненормализованный 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), yes/no (представлен бит), цены (представлены десятичной дробью) и текстовые кляксы (представлены текстом).

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

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 анализирует файл, как если бы каждая новая строка соответствовала одной строке databazse. Я могу загрузить файл в OpenOffice без проблем.

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

обновление:

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

15 ответов


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

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

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

Import textfile

Скриншот: "Импорт textfile " dialog

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

enter image description here


использовать 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'


самый простой способ, который я импортировал 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

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


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

я использовал этот метод для импорта более 100K записей ( ~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);

очень важно включить последнюю строку, если у вас есть более одного поля i.e обычно он пропускает последнее поле (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);

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

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

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

  3. перейдите к интерфейсу phpMyAdmin.

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

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

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

  7. выберите опцию "CSV с использованием данных загрузки".

  8. введите","в поле "завершается".

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

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

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


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

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

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


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

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

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

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

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


вы также можете попробовать этот онлайн-инструмент для создания операторов SQL create/insert на основе вашего CSV. http://www.convertcsvtomysql.com/

Что мне нравится в этом инструменте:

  • простой
  • он не только генерирует операторы INSERT, но и создает операторы для создания таблицы
  • при генерации операторов CREATE этот инструмент не просто делает все поля VARCHAR-он анализирует данные в вашем CSV и на основе этого анализа, он выбирает правильный тип данных.

недостатки

  • размер входного файла ограничен 3 МБ
  • возможно, вы не захотите отдавать свои данные какой-то третьей стороне

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

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

enter image description here


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

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

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

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


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

<?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>'
       }
    ?>

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

вот пример файла excel screen shot:

enter image description here

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

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

enter image description here

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

ЛОКАЛЬНАЯ ЗАГРУЗКА ДАННЫХ INFILE
'D:/folder_name/myfilename.КШМ' В столовую почту ПОЛЯ ЗАКАНЧИВАЮТСЯ НА ',' (fname,lname ,электронная почта, телефон);

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

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


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

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

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

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

для установки люкс

pip install csvkit

требования: python-dev, libmysqlclient-dev, MySQL-python

apt-get install python-dev libmysqlclient-dev
pip install MySQL-python