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

253

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

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

  • 14
    И если у вас OSX, у Sequel Pro есть отличный инструмент для импорта, и это БЕСПЛАТНО ;-)
  • 29
    Мне удивительно, что оригинальный постер ответил на свой вопрос лучше, чем кто-либо другой ... Я не знаю, почему так много людей готовы давать рекомендации по программному обеспечению, когда существует существующая команда SQL, которая может быть программной, а не пользовательским интерфейсом -основан. Я не знаю ни о ком другом, но программно для меня это означает, что у меня могут быть настроены сценарии для автоматического импорта файлов по временным меткам, тогда как на основе пользовательского интерфейса это чисто ручной.
Показать ещё 3 комментария
Теги:
csv
load-data-infile

18 ответов

110
Лучший ответ

Ядро вашей проблемы похоже на сопоставление столбцов в CSV файле с таковыми в таблице.

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

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

Изображение 872

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

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

Изображение 873

  • 25
    Для Mac OSX используйте Sequel Pro.
  • 3
    Я только что попробовал, и мне нужно сначала создать таблицу ... вместо того, чтобы использовать имена столбцов.
Показать ещё 11 комментариев
170

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

  • 5
    mysqlimport использует LOAD DATA INFILE... за кулисами, так что это почти то же самое.
  • 6
    Как и в случае LOAD DATA INFILE , вам нужно создать таблицу, прежде чем вы сможете использовать mysqlimport .
Показать ещё 4 комментария
69

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

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

здесь .csv data Изображение 874

вот команда:

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

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

  • 1
    ',' -> '\ t', '"' -> '' в случае файлов TSV и удалить последнюю строку, если заголовок отсутствует. (Надеюсь, что поисковые роботы индексируют это).
  • 15
    Если это локальный файл, вам может потребоваться LOAD DATA LOCAL INFILE . Если это приводит к ошибке 1148 «используемая команда не разрешена», вы можете включить ее, запустив mysql в командной строке с параметром --local-infile .
Показать ещё 3 комментария
43

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

Я использовал этот метод для импорта более 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);
  • 0
    Я импортировал 16 тысяч строк и 48 столбцов. Спасибо, приятель.
  • 0
    Это лучшее решение. Для всех, кому интересно, как быстро это происходит: я импортировал 3,2 миллиона строк менее чем за 14 секунд на экземпляре AWS Lightsail за 20 долларов в месяц со встроенным сервером MySQL (не высокопроизводительным RDS). Потрясающие!
Показать ещё 3 комментария
26

В следующий раз, когда вам нужно сделать что-то подобное, попробуйте использовать sqlizer.io. Это простой онлайн-инструмент, в который вы можете загрузить свой CSV файл. Он будет генерировать команду CREATE TABLE со всеми правильными типами и серией операторов INSERT, которые соответствуют созданной таблице.

Вам просто нужно изменить тип файла из таблицы Excel в CSV файл:

Изображение 875

21

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

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

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

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

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

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

  • Перейдите в файл CSV.

  • Выберите параметр "CSV, используя LOAD DATA".

  • Введите "," в "поля, завершенные".

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

  • Нажмите кнопку "Пуск", и все будет готово.

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

  • 0
    Это хорошо и просто. Я предпочитаю создавать таблицы и столбцы с помощью SQL (поэтому я пропускаю шаг № 9) и вставлять данные через импорт CSV. Не забудьте установить NULL в CSV для любых автоинкрементных полей / столбцов.
  • 0
    Обратите внимание, что phpMyAdmin приводит к сбою, когда кириллические символы включены в файл CSV, независимо от того, говорите ли вы использовать utf-8.
Показать ещё 1 комментарий
10

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

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

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

7

Командная строка mysql подвержена слишком большому количеству проблем при импорте. Вот как вы это делаете:

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

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

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

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

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

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

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

Изображение 876

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

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

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

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

Недостатки

  • Размер входного файла ограничен 3mb
  • Возможно, вы не захотите отдать свои данные третьим лицам.
  • 2
    SQL Fiddle делает это тоже. Установите для движка базы данных MySQL, нажмите «Текст в DDL», вставьте содержимое CSV в диалоговое окно и нажмите «Добавить в DDL». Панель DDL будет содержать оператор CREATE TABLE и оператор INSERT VALUES. Если вы не нажмете «построить схему», все данные останутся в вашем веб-браузере. Я не проверял это на больших файлах CSV.
  • 0
    очень хороший сайт, так как он генерирует многозначный старт INSERT, который полностью настраиваемый и надежный для вставки данных по сравнению с импортом в CSV.
Показать ещё 1 комментарий
1

Еще одно решение - использовать инструмент 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
1

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

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

Вот пример снимка экрана excel:

Изображение 877

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

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

Изображение 878

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

ЛОКАЛЬНАЯ ИНФОРМАЦИЯ ЗАГРУЗИТЬ ДАННЫЕ
'D:/folder_name/myfilename.csv' INTO TABLE mail ПОЛЯ, ПРЕРЫВШИЕСЯ ',' (имя, имя, адрес электронной почты, телефон)

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

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

1

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,[email protected]
Brandon Wilson,541-309-5149,[email protected]
Craig White,516-795-8065,[email protected]
David Whitney,713-214-3966,[email protected]
1

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

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

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

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

0

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

0

В случае, если вы используете Intellij https://www.jetbrains.com/datagrip/features/importexport.html

Изображение 879

Ещё вопросы

Сообщество Overcoder
Наверх
Меню