Імпорт даних MYSQL з CSV за допомогою INFILE LOAD DATA INFILE


106

Я імпортую деякі дані в 20000 рядків з файлу CSV в Mysql.

Стовпці в CSV розташовані в іншому порядку, ніж стовпці таблиці MySQL. Як автоматично призначити стовпці, що відповідають стовпцям таблиці Mysql?

Коли я страчу

LOAD DATA INFILE'abc.csv' INTO TABLE abc

цей запит додає всі дані до першого стовпця.

Запропонуйте автоматичний синтаксис для імпорту даних у Mysql.



Сталося зі мною, я дізнався, що текстовий файл був написаний рядками, що закінчуються символом '\ r', і я намагався імпортувати дані, очікуючи, що рядки будуть припинені за допомогою '\ n'
Tamer

2
Я написав обширний підручник для завантаження даних CSV в mysql разом із інструментом генератора синтаксису в Excel . Це має бути корисним читачам.
mysql_user

Відповіді:


169

Ви можете використовувати команду LOAD DATA INFILE для імпорту CSV- файлу в таблицю.

Перевірте це посилання MySQL - ЗАВАНТАЖУЙТЕ ДАНІ ВНІФІЛ .

LOAD DATA LOCAL INFILE 'abc.csv' INTO TABLE abc
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(col1, col2, col3, col4, col5...);

Для користувачів MySQL 8.0:

Використовуючи LOCALключове слово, утримуйте ризики безпеки, а для MySQL 8.0 LOCALфункція Falseза замовчуванням. Можливо, ви побачите помилку:

ПОМИЛКА 1148: Використовувана команда заборонена в цій версії MySQL

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


1
Чи можу я знати, що IGNORE 1 LINESсаме тут робить? Заздалегідь спасибі.
Кушик Дас

5
@KoushikDas Ігнорує перший рядок, який визначає назви стовпців
Сахарш Шах

28
застереження: LINES TERMINATED THE \ \ r \ n 'clause працює для файлів Windows, але для файлів Linux має бути лише \ \ n'.
ChuckCottrill

1
Важливо пам’ятати про використання косої риски вперед: stackoverflow.com/a/42878067/470749
Ryan

3
лише зауважте, що (col1, col2, col3 ....) не потрібно. Корисно, якщо ви створюєте таблицю на льоту, перш ніж використовувати її для вставки даних.
Кіран Квін

51

Напевно, вам потрібно встановити FIELDS TERMINATED BY ','або, будь-який роздільник.

Для файлу CSV ваш вислів повинен виглядати так:

LOAD DATA INFILE 'data.csv' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

1
ЗАВАНТАЖИТИ ДАНІ МІСЬКОГО ІНФІЛЮ ... Без МІСЬКОГО доступу до нього заборонено.
кетанкк

49

Перш ніж імпортувати файл, потрібно підготувати наступне:

  • Таблиця бази даних, до якої будуть імпортовані дані з файлу.
  • CSV-файл із даними, які співпадають із кількістю стовпців таблиці та типом даних у кожному стовпчику.
  • Обліковий запис, який підключається до сервера баз даних MySQL, має права FILE та INSERT.

Припустимо, у нас є наступна таблиця:

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

Створіть таблицю з використанням наступних запитів:

CREATE TABLE IF NOT EXISTS `survey` (
  `projectId` bigint(20) NOT NULL,
  `surveyId` bigint(20) NOT NULL,
  `views` bigint(20) NOT NULL,
  `dateTime` datetime NOT NULL
);

ВАШИЙ CSV-ФАЙЛ МОЖЕ ВІДКЛАДНО ФОРМУВАННЯ ДЛЯ ПРИКЛАДУ ДЛЯ ПОСЛІДНОГО ДОСЛІДЖЕННЯ З ВІДКЛЮЧЕНОМ ІМІДЖ:

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

Якщо все добре. Будь ласка, виконайте наступний запит, щоб ЗАВАНТАЖИТИ ДАНІ З ФАЙЛУ CSV:

ПРИМІТКА. Будь ласка, додайте абсолютний шлях вашого файлу CSV

LOAD DATA INFILE '/var/www/csv/data.csv' 
INTO TABLE survey 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

Якщо все зробилося. ви успішно експортували дані з CSV в таблицю


Як ми можемо перевірити, чи файл CSV має належний тип даних для кожного стовпця, оскільки за замовчуванням він ігнорує недійсний тип даних.
Умар Аббас

2
Вибачте, що заважаєте на таку стару відповідь. Це дуже переконливо, але як я можу пропустити якесь поле. Скажімо, у моїй таблиці є проектId, surveyId та dateTime, як я можу пропустити поле "види"?
Данський Ансарі

@MD Danish Ansari, Вибачте, що відповів на старе запитання, але ви можете вказати стовпці таблиці. Я зробив наступне, де мені потрібно пропустити перше поле (первинний ключ автоматичного збільшення), а також кілька інших полів: ЗАВАНТАЖИТИ ДАНІ ЛОКАЛЬНОГО ІНФІЛЬ 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv "В ТАБЛИЦЮ my_log_tbl ПОЛИ, ЗАВЕРШЕНІ", "ЗАКРІПЛЕНО" "" ЛІНІЯМИ, ЗАКРІТНІ '\ r \ n' (UserId, CustomerId, InstitutionId, ApplicationId, FullURL, AccessTimeStamp, IPaddress); назва таблиці, але це не спрацювало. Вони повинні з’явитися в кінці.
Калінма

17

Синтаксис:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name' INTO TABLE `tbl_name`
CHARACTER SET [CHARACTER SET charset_name]
FIELDS [{FIELDS | COLUMNS}[TERMINATED BY 'string']] 
[LINES[TERMINATED BY 'string']] 
[IGNORE number {LINES | ROWS}]

Дивіться цей приклад:

LOAD DATA LOCAL INFILE
'E:\\wamp\\tmp\\customer.csv' INTO TABLE `customer`
CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

10

Вставте більшу кількість 7000000 записів за 1 хвилину в базу даних (надшвидкий запит з розрахунком)

mysqli_query($cons, '
    LOAD DATA LOCAL INFILE "'.$file.'"
    INTO TABLE tablename
    FIELDS TERMINATED by \',\'
    LINES TERMINATED BY \'\n\'
    IGNORE 1 LINES
    (isbn10,isbn13,price,discount,free_stock,report,report_date)
     SET RRP = IF(discount = 0.00,price-price * 45/100,IF(discount = 0.01,price,IF(discount != 0.00,price-price * discount/100,@RRP))),
         RRP_nl = RRP * 1.44 + 8,
         RRP_bl = RRP * 1.44 + 8,
         ID = NULL
    ');
$affected = (int) (mysqli_affected_rows($cons))-1; 
$log->lwrite('Inventory.CSV to database:'. $affected.' record inserted successfully.');

RRP і RRP_nl і RRP_bl не в csv, але ми обчислюємо це і після того, як вставити це.


2

Якщо ви працюєте LOAD DATA LOCAL INFILEз оболонкою Windows, і вам потрібно скористатися OPTIONALLY ENCLOSED BY '"', вам доведеться зробити щось подібне, щоб правильно вийти з символів:

"C:\Program Files\MySQL\MySQL Server 5.6\bin\mysql" -u root --password=%password% -e "LOAD DATA LOCAL INFILE '!file!' INTO TABLE !table! FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"^""' LINES TERMINATED BY '\n' IGNORE 1 LINES" --verbose --show-warnings > mysql_!fname!.out

2

припустимо, ви використовуєте xampp та phpmyadmin

у вас є ім'я файлу 'ratings.txt' ім'я таблиці 'рейтинги' та назва бази даних 'фільми'

якщо ваш xampp встановлений у "C: \ xampp \"

скопіюйте файл "ratings.txt" у папку "C: \ xampp \ mysql \ data \ movies"

LOAD DATA INFILE 'ratings.txt' INTO TABLE ratings FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;

Сподіваємось, це може допомогти вам опустити помилку, якщо ви робите це на localhost


0

Ви можете завантажити дані з CSV або текстового файлу. Якщо у вас є текстовий файл із записами з таблиці, ви можете завантажити ці записи всередині таблиці. Наприклад, якщо у вас є текстовий файл, де кожен рядок є записом зі значеннями для кожного стовпця, ви можете завантажувати записи таким чином.

таблиця.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

- приклад на windows

LOAD DATA LOCAL INFILE 'C:\\directory_example\\table.txt'
INTO TABLE Table
CHARACTER SET UTF8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'; 

0

Я отримував код помилки: 1290. Сервер MySQL працює з опцією --secure-file-priv, тому він не може виконати цю операцію

Це працювало для мене на Windows 8.1 64 біт за допомогою wampserver 3.0.6 64bit.

Відредаговано файл my.ini з C: \ wamp64 \ bin \ mysql \ mysql5.7.14

Видаліть запис secure_file_priv c: \ wamp64 \ tmp \ (або будь-який рейтинг у вас тут)

Зупинив усе - вийти з вогню тощо - і перезапустив усе; потім надіньте файл мого резюме на C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (останній реж - це моє ім'я бази даних)

виконано ЗАВАНТАЖЕННЯ ДАНИХ INFILE 'myfile.csv'

НА СТОЛИНИ випускників

ПОЛИ, ЗАВЕРШЕНІ ","

ЗАКЛЮЧЕНО "" "

ЛІНІЇ, ЗАКРІТНІ "\ r \ n"

IGNORE 1 ЛІНІЇ

... і ВОЙЛА !!!


0

Ви можете спробувати вставити так:

LOAD DATA INFILE '/tmp/filename.csv' replace INTO TABLE [table name] FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1,field2,field3);

0

У ці дні (до кінця 2019 року) я вважаю за краще використовувати такий інструмент, як http://www.convertcsv.com/csv-to-sql.htm. У вас є багато рядків, за допомогою яких ви можете запускати розділені блоки, зберігаючи помилки користувача, коли з них походить csv. таблиця з кінцевим користувачем.

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