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.