MYSQL импортирует данные из csv с помощью LOAD DATA INFILE


106

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

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

Когда я выполняю

LOAD DATA INFILE'abc.csv' INTO TABLE abc

этот запрос добавляет все данные в первый столбец.

Предложите автоматический синтаксис для импорта данных в Mysql.



Это случилось со мной, я обнаружил, что текстовый файл был написан со строками, оканчивающимися на '\ r', и я пытался импортировать данные, ожидая, что строки будут завершены с помощью '\ n'
— Укротитель

2
Я написал обширное руководство по загрузке данных CSV в MySQL вместе с инструментом генератора синтаксиса в Excel . Это должно быть полезно читателям.
— mysql_user

Ответы:


170

Вы можете использовать команду LOAD DATA INFILE для импорта файла csv в таблицу.

Проверьте эту ссылку MySQL - ЗАГРУЗИТЬ ДАННЫЕ INFILE .

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 BY '\ r \ n' работает для файлов Windows, но в файлах Linux должно быть только '\ n'.
— ChuckCottrill

1
Важно помнить , чтобы использовать слеш: stackoverflow.com/a/42878067/470749
— Райано

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
ЗАГРУЗИТЬ ДАННЫЕ ЛОКАЛЬНЫЙ ИНФАЙЛ ... Без ЛОКАЛЬНОГО доступ запрещен.
— ketankk

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
Извините за беспокойство по поводу такого старого ответа. Это очень убедительно, но как я могу пропустить какое-то поле. Допустим, в моей таблице есть projectId, SurveyId и dateTime, как я могу пропустить поле «views»?
— Датский Ансари

@MD Danish Ansari, извините, что ответил на старый вопрос, но вы можете указать столбцы таблицы. Я сделал следующее, где мне нужно пропустить первое поле (первичный ключ автоинкремента), а также несколько других полей: LOAD DATA LOCAL INFILE 'C: \\ xampp \\ htdocs \\ data_files \\ 2018-10_statistics. csv 'INTO TABLE my_log_tbl FIELDS TERMINATED BY', 'ENCLOSED BY' "'LINES TERMINATED BY' \ 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

у вас есть имя файла «rating.txt» имя таблицы «рейтинги» и имя базы данных «фильмы»

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

скопируйте ваш файл "rating.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 или текстового файла. Если у вас есть текстовый файл с записями из таблицы, вы можете загрузить эти записи в таблицу. Например, если у вас есть текстовый файл, где каждая строка представляет собой запись со значениями для каждого столбца, вы можете загрузить записи таким образом.

table.sql

id //field 1

name //field2

table.txt

1,peter

2,daniel

...

- пример на окнах

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, поэтому он не может выполнить этот оператор.

Это сработало для меня на 64-разрядной версии Windows 8.1 с использованием 64-разрядной версии wampserver 3.0.6.

Отредактировал файл my.ini из C: \ wamp64 \ bin \ mysql \ mysql5.7.14

Удалите запись secure_file_priv c: \ wamp64 \ tmp \ (или любой другой каталог, который у вас есть)

Остановил все - выйти из wamp и т. Д. - и все перезапустил; затем разместите мой файл cvs на C: \ wamp64 \ bin \ mysql \ mysql5.7.14 \ data \ u242349266_recur (последний каталог - это имя моей базы данных)

выполненный LOAD DATA INFILE 'myfile.csv'

INTO TABLE выпускники

ПОЛЯ, ЗАКОНЧЕННЫЕ ','

ЗАКРЫТО '"'

ЛИНИИ, ЗАКАНЧИВАЕМЫЕ НА '\ r \ n'

ИГНОРИРОВАТЬ 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.