62

我有一个名为 350MB 的文件text_file.txt,其中包含此制表符分隔的数据:

345868230   1646198120  1531283146  Keyword_1531283146  1.55    252910000
745345566   1646198120  1539847239  another_1531276364  2.75    987831000
...

MySQL 数据库名称:Xml_Date

数据库表:PerformanceReport

我已经创建了包含所有目标字段的表。

我想将此文本文件数据导入 MySQL。我用谷歌搜索并发现了一些类似的命令,LOAD DATA INFILE并且对如何使用它感到非常困惑。

如何导入此文本文件数据?

4

9 回答 9

78

它应该像...一样简单

LOAD DATA INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport;

默认情况下LOAD DATA INFILE使用制表符分隔,每行一行,所以应该接受它就好了。

于 2012-11-27T08:17:33.173 回答
56

使用 MySQL 的 LOAD DATA 命令的演练:

  1. 创建你的表:

    CREATE TABLE foo(myid INT, mymessage VARCHAR(255), mydecimal DECIMAL(8,4));
    
  2. 创建制表符分隔文件(注意列之间有制表符):

    1   Heart disease kills     1.2
    2   one out of every two    2.3
    3   people in America.      4.5
    
  3. 使用加载数据命令:

    LOAD DATA LOCAL INFILE '/tmp/foo.txt' 
    INTO TABLE foo COLUMNS TERMINATED BY '\t';
    

    如果您收到无法运行此命令的警告,则必须启用--local-infile=1此处描述的参数:How can I correct MySQL Load Error

  4. 行被插入:

    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
    
  5. 检查它是否有效:

    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 myid=@col1,mydecimal=@col3;

文件内容被放入变量@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)
于 2014-01-03T01:50:38.040 回答
15

如果您的表格由制表符以外的其他人分隔,则应将其指定为...

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
于 2012-11-27T11:24:12.013 回答
4

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
于 2015-04-08T13:33:38.647 回答
2

您应该设置选项:

local-infile=1

进入 my.cnf 文件的 [mysql] 条目或使用 --local-infile 选项调用 mysql 客户端:

mysql --local-infile -uroot -pyourpwd yourdbname

您必须确保在 [mysqld] 部分中也定义了相同的参数,以启用“本地 infile”功能服务器端。

这是一个安全限制。

LOAD DATA LOCAL INFILE '/softwares/data/data.csv' INTO TABLE tableName;
于 2018-01-17T12:45:52.033 回答
1
  1. 确保您的 Local-Infile 变量设置为 True (ON)

    mysql> show global variables like 'local_infile';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | local_infile  | OFF   |
    +---------------+-------+
    1 row in set (0.04 sec)
    
    mysql> set global local_infile=true;
    Query OK, 0 rows affected (0.01 sec)
    
  2. 找到正确的路径来存储 txt 文件以加载到 SQL 表中

    mysql>  SELECT @@GLOBAL.secure_file_priv;
    +------------------------------------------------+
    | @@GLOBAL.secure_file_priv                      |
    +------------------------------------------------+
    | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ |
    +------------------------------------------------+
    1 row in set (0.00 sec)
    
  3. 使用路径中的数据 infile 加载(在路径中使用反斜杠)

mysql>  load data infile 'C:/ProgramData/MySQL/MySQL Server
8.0/Uploads/text_file.txt' into table TABLE_NAME fields terminated by '\t' lines terminated by '\n';
于 2021-11-17T07:16:17.140 回答
1

在此处输入图像描述

对我来说,只需添加“本地”关键字就可以了,请参阅附图以获得更简单的解决方案。

我附加的图像包含两个用例:

(a) 我在哪里得到这个错误。(b) 只需添加“Local”关键字即可解决错误。

于 2019-09-07T11:27:20.337 回答
1
LOAD DATA INFILE '/home/userlap/data2/worldcitiespop.txt' INTO TABLE cc FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;
  • IGNORE 1 LINES 跳过包含列名的初始标题行
  • FIELDS TERMINATED BY ',' 是读取逗号分隔的文件
  • 如果您在 Windows 系统上生成了文本文件,则可能必须使用 LINES TERMINATED BY '\r\n' 来正确读取文件,因为 Windows 程序通常使用两个字符作为行终止符。某些程序(例如写字板)在写入文件时可能会使用 \r 作为行终止符。要读取此类文件,请使用 LINES TERMINATED BY '\r'。
于 2018-07-27T17:57:31.037 回答
0

1.如果是制表符分隔的txt文件:

LOAD DATA LOCAL INFILE 'D:/MySQL/event.txt' INTO TABLE 事件

由 '\r\n' 终止的行;

2. 否则:

LOAD DATA LOCAL INFILE 'D:/MySQL/event.txt' INTO TABLE 事件

由 'x' 终止的字段(这里 x 可以是逗号 ','、制表符 '\t'、分号 ';'、空格 ' ')

由 '\r\n' 终止的行;

于 2018-03-16T21:40:43.417 回答