2012-11-27 72 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; 
相關問題