Імпорт даних 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.