1

区切り記号のない各行の文字数が静的な ASCII ファイルがあります。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;

各列の開始位置と終了位置を指定することはできますか?

4

3 に答える 3

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;
于 2013-09-24T20:09:55.197 に答える
1

ドキュメントによると、一時テーブルを使用せずに固定形式のファイルをロードできます。

FIELDS TERMINATED BY と FIELDS ENCLOSED BY の値が両方とも空 ('') の場合、固定行 (区切りなし) 形式が使用されます。固定行形式では、フィールド間に区切り文字は使用されません (ただし、行末記号を使用することはできます)。代わりに、フィールド内のすべての値を保持するのに十分な幅のフィールドを使用して、列の値が読み書きされます。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);
于 2013-09-25T20:31:26.290 に答える