Ответ 1
Это должно быть так просто, как...
LOAD DATA INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport;
По умолчанию LOAD DATA INFILE
использует табуляцию с разделителями, по одной строке на строку, поэтому она должна быть в порядке.
У меня есть файл 350 Мбайт с именем text_file.txt
, содержащий данные с разделителями табуляции:
345868230 1646198120 1531283146 Keyword_1531283146 1.55 252910000
745345566 1646198120 1539847239 another_1531276364 2.75 987831000
...
MySQL Имя базы данных: Xml_Date
Таблица базы данных: PerformanceReport
Я уже создал таблицу со всеми полями назначения.
Я хочу импортировать данные этого текстового файла в MySQL. Я googled и нашел некоторые команды как LOAD DATA INFILE
и довольно запутался в том, как его использовать.
Как импортировать данные этого текстового файла?
Это должно быть так просто, как...
LOAD DATA INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport;
По умолчанию LOAD DATA INFILE
использует табуляцию с разделителями, по одной строке на строку, поэтому она должна быть в порядке.
Пошаговое руководство по использованию команды MySQL LOAD DATA:
Создайте таблицу:
CREATE TABLE foo(myid INT, mymessage VARCHAR(255), mydecimal DECIMAL(8,4));
Создайте свой файл с разделителями табуляции (обратите внимание, что между столбцами есть вкладки):
1 Heart disease kills 1.2
2 one out of every two 2.3
3 people in America. 4.5
Используйте команду данных загрузки:
LOAD DATA LOCAL INFILE '/tmp/foo.txt'
INTO TABLE foo COLUMNS TERMINATED BY '\t';
Если вы получите предупреждение о том, что эта команда не может быть запущена, вам нужно включить параметр --local-infile=1
, описанный здесь: Как я могу исправить ошибку загрузки MySQL
Строки вставлены:
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
Проверьте, не сработало ли это:
mysql> select * from foo;
+------+----------------------+-----------+
| myid | mymessage | mydecimal |
+------+----------------------+-----------+
| 1 | Heart disease kills | 1.2000 |
| 2 | one out of every two | 2.3000 |
| 3 | people in America. | 4.5000 |
+------+----------------------+-----------+
3 rows in set (0.00 sec)
Как указать, какие столбцы загружать столбцы текстового файла:
Вот так:
LOAD DATA LOCAL INFILE '/tmp/foo.txt' INTO TABLE foo
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
(@col1,@col2,@col3) set [email protected],[email protected];
Содержимое файла помещается в переменные @col1, @col2, @col3. myid получает столбец 1, а mydecimal получает столбец 3. Если это было выполнено, оно опускает вторую строку:
mysql> select * from foo;
+------+-----------+-----------+
| myid | mymessage | mydecimal |
+------+-----------+-----------+
| 1 | NULL | 1.2000 |
| 2 | NULL | 2.3000 |
| 3 | NULL | 4.5000 |
+------+-----------+-----------+
3 rows in set (0.00 sec)
Если ваша таблица разделена другими, чем вкладками, вы должны указать ее как...
LOAD DATA LOCAL
INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport
COLUMNS TERMINATED BY '\t' ## This should be your delimiter
OPTIONALLY ENCLOSED BY '"'; ## ...and if text is enclosed, specify here
Оператор LOAD DATA INFILE читает строки из текстового файла в таблицу с очень высокой скоростью.
LOAD DATA INFILE '/tmp/test.txt'
INTO TABLE test
FIELDS TERMINATED BY ','
LINES STARTING BY 'xxx';
Если файл данных выглядит так:
xxx"abc",1
something xxx"def",2
"ghi",3
Результирующие строки будут ( "abc", 1) и ( "def", 2). Третья строка в файле пропускается, поскольку она не содержит префикса.
LOAD DATA INFILE 'data.txt'
INTO TABLE tbl_name
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
Вы также можете загружать файлы данных с помощью утилиты mysqlimport; он работает, отправив инструкцию LOAD DATA INFILE на сервер
mysqlimport -u root -ptmppassword --local test employee.txt
test.employee: Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
Вы должны установить опцию:
local-infile=1
в вашу [mysql] запись файла my.cnf или вызовите клиент mysql с опцией --local-infile:
mysql --local-infile -uroot -pyourpwd yourdbname
Вы должны быть уверены, что этот же параметр определен и в вашем разделе [mysqld], чтобы включить серверную часть "локального infile".
Это ограничение безопасности.
LOAD DATA LOCAL INFILE '/softwares/data/data.csv' INTO TABLE tableName;
1. если это текстовый файл с разделителями табуляции:
ЗАГРУЗИТЬ ДАННЫЕ ЛОКАЛЬНЫЙ ИНФИЛЬ Событие 'D: /MySQL/event.txt' INTO TABLE
ЛИНИИ, ПРЕКРАЩЕННЫЕ '\ r\n';
2. в противном случае:
ЗАГРУЗИТЬ ДАННЫЕ ЛОКАЛЬНЫЙ ИНФИЛЬ Событие 'D: /MySQL/event.txt' INTO TABLE
ПОЛЯ, ПРЕКРАЩЕННЫЕ 'x' (здесь x может быть запятой ',', табуляция '\ t', точка с запятой ';', пробел '')
ЛИНИИ, ПРЕКРАЩЕННЫЕ '\ r\n';
LOAD DATA INFILE '/home/userlap/data2/worldcitiespop.txt' INTO TABLE cc FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;
Для меня, просто добавив ключевое слово "LOCAL", получилось, см. прикрепленное изображение для более простого решения.
Мое прикрепленное изображение содержит оба варианта использования:
(а) Где я получал эту ошибку. (б) Где ошибка была решена просто добавив ключевое слово "Local".
Не работает с Mysql 8.
/* ERROR 1148 (42000): The used command is not allowed with this MySQL version
*/