如何将文本文件中的数据导入mysql数据库

Posted

技术标签:

【中文标题】如何将文本文件中的数据导入mysql数据库【英文标题】:How to import data from text file to mysql database 【发布时间】:2012-11-14 19:30:39 【问题描述】:

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

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

mysql 数据库名称:Xml_Date

数据库表:PerformanceReport

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

我想将此文本文件数据导入 MySQL。我用谷歌搜索了一些命令,比如LOAD DATA INFILE,对如何使用它感到很困惑。

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

【问题讨论】:

【参考方案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)
    

    找到正确的路径来存储用于加载到 SQL 表中的 txt 文件

    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)
    

    使用路径中的数据 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';

【讨论】:

【参考方案2】:

对我来说,只需添加“LOCAL”关键字就可以了,请查看附件图片以获得更简单的解决方案。

我附上的图片包含两个用例:

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

【讨论】:

【参考方案3】:
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'。

【讨论】:

【参考方案4】:

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' 终止的行;

【讨论】:

【参考方案5】:

你应该设置选项:

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;

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

使用 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 参数:How can I correct MySQL Load Error

    插入的行:

    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 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)

【讨论】:

在我的 MySQL 版本(Ver 14.14 Distrib 5.5.41)上,我需要从这些命令中省略 LOCAL。 (ERROR 1148 (42000): 该 MySQL 版本不允许使用的命令) LOCAL 关键字会影响文件的预期位置和错误处理。 LOCAL 仅在您的服务器和客户端都已配置为允许时才有效。 dev.mysql.com/doc/refman/5.0/en/load-data.html 在这里分享我的愚蠢:我认为“本地”在服务器上是本地的(从 mysql 服务器引擎的角度来看)......但正如你指出的 Eric,它都在文档中.它说 LOCAL 选项导致 mysqlimport 从客户端主机读取数据文件。这意味着如果我在自己的计算机上运行 MySQL Workbench,LOAD DATA 命令会在我的计算机上查找文件! 您可能还想使用 CHARSET SET 正确解析您的文件【参考方案8】:

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

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

【讨论】:

你能详细说明你的答案吗?【参考方案9】:

它应该像...一样简单

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

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

【讨论】:

上面的代码如何理解这将在哪个数据库中插入记录? @LOKESH:单独来看,它不能。事先,您需要使用 USE 命令设置要使用的数据库。 我认为数据表也需要在数据库中创建才能正常工作? @HattrickNZ 是的,并且操作已经创建了问题中提到的表 LOAD DATA INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport FIELDS TERMINATED BY '\t'

以上是关于如何将文本文件中的数据导入mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章

mysq将表数据导入文件并将文件从远程服务下载到本地

如何将数据文件导入MySQL?

如何将数据文件导入MySQL?

如何在mysql中批量导入大的sql文本文件

MySQL phpMyAdmin 从文本导入而没有主键?

[hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入hive