Як імпортувати файл 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/uk/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, яка може бути програмною, а не UI -оснований. Я не знаю ні про кого іншого, але програмно значить для мене, що я можу мати сценарії, створені для автоматичного імпорту файлів на часових позначках, тоді як на основі інтерфейсу - це суто вручну.
Chris Cirefice

@ChrisCirefice: Я думаю, що прийнята відповідь це добре пояснює. Йому потрібна була допомога вручну, створивши команду "завантаження даних", з якою може допомогти графічна програма. Після того, як графічна програма створила команду 'data data', він міг її повторно використати програмно.
AlexC

@Merrick це спрацювало частування на osx
weaveoftheride

Відповіді:


133

Ядром вашої проблеми, здається, є відповідність стовпців у файлі CSV до тих, що знаходяться в таблиці.

Багато графічних клієнтів mySQL мають дуже хороші діалоги імпорту для подібних речей.

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

Імпорт текстового файлу

Знімок екрана: діалогове вікно "Імпорт текстового файлу"

Щоб відкрити діалогове вікно Імпорт текстового файлу, перейдіть до Tools > Import CSV file:

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


25
Для Mac OSX використовуйте Sequel Pro.
Agi Hammerthief

3
Я просто спробував це, і мені потрібно, щоб спершу створити таблицю ... замість того, щоб використовувати назви стовпців.
Домінік

3
Ви повинні вибрати таблицю, перш ніж ви можете продовжувати ... а оскільки вся справа не в тому, щоб складати таблицю ...
Домінік

3
Зауважте, що в Linux HeidiSQL дуже добре працює під Wine.
АлехандроВД

1
@Paul Сама суть відповіді полягає в тому, що інструменти GUI можуть полегшити відповідність імпортних стовпців до стовпців таблиці.
Pekka

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'


6
mysqlimportвикористовує LOAD DATA INFILE...за лаштунками, так що це майже те саме.
Младен Ябланович

8
Як і у випадку LOAD DATA INFILE, вам потрібно створити таблицю, перш ніж можна використовувати mysqlimport.
Маркус Даунінг

@ МладенДжабланович, це точно не те саме. Спробуйте імпортувати 1bil рядків. Ви здивуєтеся, яка велика різниця це стосується продуктивності
ninjabber

@ninjabber Документи говорять, що клієнт mysqlimport надає інтерфейс командного рядка INFILE ЗАВАНТАЖЕННЯ ДАНИХ , тому теоретично неможливо запропонувати будь-яку перевагу від продуктивності LOAD DATA INFILE.
Младен Ябланович

1
також потрібно --fields-optionally-enclosed-by=\"і `--fields-escape-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 та видаліть останній рядок, якщо немає заголовка. (сподіваємось, пошукові сканери індексують це).
Кровотечі пальці

16
Якщо це локальний файл, можливо, вам доведеться LOAD DATA LOCAL INFILE. Якщо при цьому з'являється помилка 1148 "використана команда заборонена", ви можете увімкнути її, запустивши mysql в командному рядку з --local-infile.
Big McLargeHuge

я отримав помилку: ПОМИЛКА 1045 (28000): Доступ заборонено користувачеві 'user' @ '%' (з використанням пароля: ТАК)
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);

Я імпортував 16k рядків і 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> ім'я_ім’я, прізвище, dob, номер телефону, електронна адреса, ім'я, прізвище, 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>
Faiz Ahmed

32

phpMyAdmin може обробляти імпорт CSV. Ось такі кроки:

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

  2. Видаліть заголовок із CSV (якщо такий є), щоб у файлі були лише дані.

  3. Перейдіть до інтерфейсу phpMyAdmin.

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

  5. Натисніть кнопку імпорту вгорі.

  6. Перейдіть до файлу CSV.

  7. Оберіть опцію "CSV за допомогою даних ЗАВАНТАЖЕННЯ".

  8. Введіть "," у "поля, припинені".

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

  10. Клацніть кнопку go і закінчите.

Це замітка, яку я підготував до свого майбутнього використання і поділюсь тут, якщо хтось інший може принести користь.


Це добре і просто. Я вважаю за краще створювати таблиці та стовпці через SQL (тому пропускаю крок №9) та вставляти дані за допомогою імпорту CSV. Не забудьте встановити NULLв CSV будь-які поля з автоматичним збільшенням полів / стовпців.
срібло

Зауважте, що phpMyAdmin збиває з ладу, коли символи кирилиці включаються у файл CSV, незалежно від того, ви скажете йому використовувати utf-8.
Fran Marzoa

Не забувайте змінити розмір імпорту, якщо ви імпортуєте великий файл CSV. BTW - це не гарний варіант для великих файлів CSV.
Аві

Для цього потрібно спочатку завантажити файл .csv на веб-клієнт, оскільки ви не можете переглядати локальний файл csv.
mckenzm

Так, ви можете, вам потрібно встановити прапорець "Місцеве ключове
слово

12

Ви можете виправити це, перерахувавши стовпці у вашому операторі LOAD DATA. З посібника :

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

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


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 для імпорту та автоматичного створення нової таблиці (дайте їй ім'я)
  • відкрити нову таблицю вставити первинний стовпець автоматичного номера для ідентифікатора
  • змінити тип стовпців за бажанням.
  • зроблено!

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 і не знайдете, який символ використовує для втечі. Іноді це "\". Але якщо у вас її немає, не використовуйте.


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. Знайдіть ці дані про індекс закордонної торгівлі на sqldatabase:

    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.


2

Я використовую робочий стіл mysql, щоб виконувати ту саму роботу.

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

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


Велике спасибі за вашу відповідь - будучи новим у MySQL, я про це не знав - це допомогло мені з CSV. Тепер мені також потрібно імпортувати 10 таблиць із Access - чи вважаєте ви, що найпростішим способом буде експортувати ці таблиці в Excel, з Excel в CSV, а потім скористатися цими кроками?
Наомі

Я виявив, що цей метод не імпортує всі рядки :( Із 5342 рядків він імпортував лише 2485 рядків для мене. Чому це так?
Наомі

Привіт Наомі, якщо ви перевірите журнал mysqlworkbench, він покаже вам, чому він перестав імпортувати дані. У вашому файлі БД та CSV можуть бути деякі нульові значення або тип невідповідності. Але я настійно рекомендую слідувати відповіді Хуана (відразу після мене). Його рішення краще і чистіше, ніж я.
Мехді

1

Ось зразок екрана файлу Excel:

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

Збережіть як і виберіть .csv.

І ви матимете, як показано нижче. Знімок екрана даних .csv, якщо ви відкриваєте за допомогою блокнота ++ або будь-якого іншого блокнота.

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

Переконайтесь, що ви видалили заголовок та встановили вирівнювання стовпців у .csv, як у таблиці mysql. Замініть ім'я папки на ім’я папки

ЗАВАНТАЖИТИ ДАНІ МІСЬКОГО ВІДХОДЖЕННЯ
'D: /folder_name/myfilename.csv' В ТАБЛИЦІ поштових полів, ЗАВЕРШЕНО ',' (ім'я, ім’я, електронна адреса, телефон);

Якщо великі дані, ви можете взяти каву і завантажити її!

Це все, що вам потрібно.



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

Змініть ім’я сервера, ім’я користувача, пароль, ім'я dbname, шлях до вашого файлу, ім'я таблиці та поле, яке знаходиться у вашій базі даних, яку ви хочете вставити

<?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>'
       }
    ?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.