2012-11-27 194 views
32

我有一个名为text_file.txt包含此制表符分隔数据的350MB文件:如何导入从文本文件数据到MySQL数据库

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

MySQL数据库名称:Xml_Date

数据库表:PerformanceReport

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

我想将这个文本文件数据导入到MySQL中。我GOOGLE了一下,发现一些命令,如LOAD DATA INFILE,并且对如何使用它非常困惑。

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

回答

46

它应该是那样简单......

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

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

+1

上面的代码怎么能理解哪个数据库会插入记录? – LOKESH

+1

@ LOKESH:孤立地说,它不行。事先,您需要使用USE命令设置您正在使用的数据库。 –

+0

我认为数据库需要在数据库中创建以及这个工作? – HattrickNZ

11

如果您的表被别人超过制表符分隔,应指定它喜欢...

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 
+0

您能详细说明您的答案吗? –

+1

你可以“读取”文件?我添加到接受答案的两个额外参数在注释中定义;与#。 – peixe

+1

谢谢peixe。你帮我们解决了这个问题(http://stackoverflow.com/a/38385192) – Drew

33

演练使用MySQL的LOAD DATA命令:

  1. 创建表:

    CREATE TABLE foo(myid INT, mymessage VARCHAR(255), mydecimal DECIMAL(8,4)); 
    
  2. 创建您的标签熟食店mited文件(注意有列之间标签):

    1 Heart disease kills  1.2 
    2 one out of every two 2.3 
    3 people in America.  4.5 
    
  3. 使用load data命令:

    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 [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) 
+0

在我的MySQL版本(Ver 14.14 Distrib 5.5.41)上,我需要从这些命令中省略LOCAL。 (错误1148(42000):此MySQL版本不允许使用此命令) – ManInTheArena

+0

LOCAL关键字影响文件的预期位置和错误处理。只有当您的服务器和客户端都被配置为允许它时,LOCAL才有效。 https://dev.mysql.com/doc/refman/5.0/en/load-data.html –

3

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 
0

您应该设置该选项的服务器:

local-infile=1 

到您的[MySQL的]与my.cnf文件,或致电mysql客户端的入口 - -local-infile的选项:

mysql --local-infile -uroot -pyourpwd yourdbname 

你必须确保相同的参数定义到您的[mysqld]部分太启用“LOCAL INFILE”功能的服务器端。

这是一个安全限制。

LOAD DATA LOCAL INFILE '/softwares/data/data.csv' INTO TABLE tableName; 
相关问题