2011-07-03 41 views
2

固定長テキストファイルをMySQLテーブルに変換する必要があります。
私の最大の問題は、各行に複数のセルが含まれていることです。これがファイルを私に送信する方法と、変換する主な理由です。固定長テキストファイルをSQLに変換する

細胞はすべて特定の長さです。ただし、すべてが1行に含まれています。

たとえば、行の最初の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のドキュメントは、この点(固定サイズのフィールド)で、非常に良いではありません。ここに関連部分は次のとおり

  • フィールドが値BY ENCLOSED BYとFIELDS を終了した場合の両方、( '') 空固定行(nondelimited) フォーマットが使用されています。固定行形式の場合、 フィールド間に区切り文字は使用されません(しかし、 の終端文字は引き続き使用できます)。代わりに、フィールドに のすべての値を保持するのに十分な幅のフィールド を使用して、列の値 が読み書きされます。TINYINT、SMALLINT、 MEDIUMINT、INT、およびBIGINTの場合、 の表示幅が何であるかにかかわらず、フィールド の幅はそれぞれ4,6,8,11,20, です。

LINES TERMINATED BYは依然として の行に使用されています。行に がすべてのフィールドを含まない場合、残りの 列はデフォルトの の値に設定されます。行 ターミネーターがない場合は、これを ''に設定する必要があります。 この場合、テキストファイルは各行のすべてのフィールドを含む でなければなりません。

固定行形式は、後述するようにNULL値の の処理にも影響します。 の文字セットを使用している場合は、固定サイズのフォーマットでは が機能しません。


ハンドリング(FIELDSによって終了し、両方が空であるBY FIELDS を封入する際に使用される)固定行フォーマットで

、NULLが 空の文字列として書かれているNULL。 の場合、NULL値と空の 文字列の両方が、 文字列として記述されているため、 ファイルが ファイルに書き込まれるときに区別できないことがあります。 ファイルを読み込むときに2つ離れて伝えることができるようにする必要がある場合は、 固定行形式を使用しないでください。


いくつかの場合には、LOAD データINFILEでサポートされていない。

  • 固定サイズ行とBLOBまたはTEXTカラム( 両方空BY ENCLOSEDによって終了FIELDSとフィールド)。ユーザ変数が 表示幅を持っていないので、

  • ユーザー変数は、固定列形式 とロードデータを使用することができません。
+0

ああ、面白い!私がこれを正しく解釈すると、これを正しく読んでいますか?単純な 'b INT'カラム(' b INT(5) 'とは対照的に)を持つテーブルを持っていると、5バイトのデータを読み込むことができなくなります。 INTデータ?また、カラムが9桁までであっても(テーブルが 'b INT(9)'で作成されているので、カラムのために予約された5文字だけをロードすることはできません?つまり、あなたはDBMSに任意の固定データを読み込むことはできませんが、ちょうど特定のテーブルの正確な幅でフォーマットされます。 –

+1

@Jonathan:私はそれをテストしたし、そうです。 CHARまたはVARCHARフィールドにデータを読み込み、必要なデータ型にCASTします。 –

関連する問題