2011-07-03 97 views
2

我需要將固定長度的文本文件轉換爲MySQL表格。
我最大的問題是每行都包含多個單元格,這就是文件發送給我的方式,也是我想要將其轉換的主要原因。將固定長度的文本文件轉換爲SQL

這些單元格都是特定的長度;但是所有都包含在一行中。

例如,線的前3個位置(1 - 3)是IRT,接下來的3個位置(4 - 6)是IFTC,接下來的5個位置(7 - 11)是FSC等。

由於該文件最多可以包含300行記錄,因此我需要一種簡單的方法將其直接導入到SQL表中。

我一直在尋找網絡小時試圖找到解決方案,但沒有逗號分隔我還沒有找到一個工作的解決方案。

如果可能的話,我想在PHP中編寫此解決方案。如果有人能給我一個函數的名字,我願意做長長的工作來解決如何使用所需的函數,我不希望人們爲我寫代碼。

+0

那麼你可以通過'\ N'拆分或'\ r \ N'讓你的「行」 那麼你可以使用substr()來得到你想要的 每一行的零件和然後插入 –

+0

使用** LOAD DATA INFILE **:http://dev.mysql.com/doc/refman/5.1/en/load-data.html –

+0

@ypercube:[LOAD DATA INFILE](http:// dev.mysql.com/doc/refman/5.1/en/load-data.html)您所引用的描述不處理固定長度的字段,不帶分隔符分隔字段。 –

回答

1

你可能不會很喜歡它,但真的不是一個簡單的方法來做你的事情。很久以前(大約在1991年),我寫了一個工具DBLDFMT(用於'數據庫加載格式')來處理這種固定長度的非分隔文件。它被調整爲生成Informix數據庫首選的加載格式(所以它默認使用管道符號來分隔字段,但當然可以使用命令行選項或環境變量來調整它)。但是,它可以創建分隔的數據,然後可以使用LOAD DATA INFILE命令更正常地進行處理。

如果您想要DBLDFMT的源代碼,請通過電子郵件與我聯繫(請參閱我的資料)。 (目前的版本,從2008年的3.17開始,沒有直接支持CSV輸出,添加它並不難,你可以或多或少地達到所需的效果,但它應該比現在更容易。 )

7

文件:

testfile.txt (4 rows) 

AAA11111xx 
BBB22222yy 
CCC33333zz 
DDD 444 aa 

表:

CREATE TABLE TestLoadDataInfile 
(a VARCHAR(3) 
, b INT(5) 
, c CHAR(2) 
) CHARSET = latin1; 

代碼:

LOAD DATA INFILE 'D:\\...\\testfile.txt' 
INTO TABLE TestLoadDataInfile 
FIELDS TERMINATED BY '' 
LINES TERMINATED BY '\r\n' ; 

結果:

mysql> SELECT * FROM TestLoadDataInfile ; 
+-----+-------+----+ 
| a | b  | c | 
+-----+-------+----+ 
| AAA | 11111 | xx | 
| BBB | 22222 | yy | 
| CCC | 33333 | zz | 
| DDD | 444 | aa | 
+-----+-------+----+ 

LOAD DATA INFILE文檔在這一點上不是很好(固定大小的字段)。下面是相關的部分:

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

LINES TERMINATED BY仍用於 單獨的行。如果一行不包含所有字段,則 列的其餘部分設置爲其默認值 值。如果您沒有一行 終結符,則應將其設置爲「'。 在這種情況下,文本文件必須包含 每個行的所有字段。

如下所述,固定行格式也影響NULL值的處理 。 注意固定大小格式不 工作如果您使用多字節 字符集


NULL處理

用固定行格式(其用於 當FIELDS TERMINATED BY和場 ENCLOSED BY都爲空),NULL是 寫爲空字符串。請注意,當寫入 文件時, 會導致表中的空值和空 中的空字符串 無法區分,因爲它們都寫爲空 字符串。如果您需要在重新讀取 文件時能夠將 分開,則不應使用固定行格式的 。


有些情況下不被LOAD DATA 支持INFILE:

  • 固定大小的行(BY TERMINATED FIELDS和FIELDS ENCLOSED BY 均爲空)和BLOB或TEXT列。

  • 用戶變量不能用於當與固定行格式 加載數據,因爲用戶變量沒有 顯示寬度。
+0

哦,有趣!如果我把它解釋爲:如果你有一個簡單的'b INT'列的表(與'b INT(5)'相對),那麼你將無法加載5個字符的數據INT數據?即使該列最多可能需要9位數字(因此該表由'b INT(9)'創建,您將無法加載恰好只有5個字符的文件?所以,你不能讀取任何固定的數據到DBMS中;只是恰好適合特定表格格式的東西。 –

+1

@Jonathan:我剛剛測試過它,是的,你是對的。將數據讀入CHAR或VARCHAR字段,然後將它們CAST到需要的數據類型中。 –

相關問題