2013-09-24 58 views
0

對於每行沒有分隔符的字符串,我都有ASCII文件的靜態字符數。我想用LOAD DATA INFILE導入到我的表中。文件的MySQL如何使用LOAD DATA INFILE指定字符串位置

實施例:

USALALABAMA                
USARARKANSAS                
USFLFLORIDA                

此表的結構:

country Char(2) 
state Char(2) 
name Varchar(70) 

CREATE TABLE `states` (
    `country` char(2) COLLATE latin1_general_ci NOT NULL, 
    `state` char(2) COLLATE latin1_general_ci NOT NULL, 
    `name` varchar(70) COLLATE latin1_general_ci NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1_general_ci COLLATE=latin1_general_ci; 

是否有可能爲每列指定一個開始和結束位置?

回答

1

根據the documentation,您可以加載固定格式文件而不使用臨時表。

如果FIELDS TERMINATED BY和FIELDS ENCLOSED BY VALUE都爲空(''),則使用固定行(非限制)格式。使用固定行格式,字段之間不使用分隔符(但仍可以有行終止符)。而是使用足夠寬的字段來讀取和寫入列值,以保存字段中的所有值。對於TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT,無論聲明的顯示寬度是多少,字段寬度分別爲4,6,8,11和20。

位置來自列定義,在您的情況下這些列定義與文件的結構匹配。所以你只需要做:

LOAD DATA INFILE 'your_file' INTO TABLE your_table 
    FIELDS TERMINATED BY '' 
    LINES TERMINATED BY '\r\n' 
    SET name = trim(name); 
+0

我試着用原來的例子,得到了奇怪的結果;第一行:country = US state = AB name =(62 spaces)。 –

+0

@CorieSlate這很奇怪,我只是測試它,它爲我工作。你確定這是你的桌子結構嗎? – rsanchez

+0

我添加了上面的SQL結構。此外,你的文本文件每行有70個字符(尾隨空格?)。 –

1

首先創建一個臨時表,您將所有行加載到它,那麼你可以從臨時表中的數據加載到使用substring

事情是這樣的主表和斯普利特領域:

CREATE TEMPORARY TABLE tmp_lines 
    (countrystring TEXT); 

LOAD DATA INFILE 'yourfilegoeshere' INTO TABLE tmp_lines 
    FIELDS TERMINATED BY '' 
    LINES TERMINATED BY '\r\n'; 

INSERT INTO main_table SELECT SUBSTRING(countrystring,1,2), SUBSTRING(countrystring,3, 2), SUBSTRING(countrystring,5) from tmp_lines; 
+0

謝謝。這和'RTRIM()'一起做我需要的。 –