1

このパターンに従う CSV ファイルがあります。

cust_id,cust_name,cust_add_1,cust_add_2,cust_city,cust_state,cust_zip,cust_email
100024,BALE #DIANA & ROY,2944 SOME RD, ,AKRON,OH,44556,an@other.net
100139,SMITH #JOHN & LINDA,1569 ANOTHER WAY, ,SARASOTA,FL,65478,
100263,DOLE #BOB,5947 LONG RD, ,GRANITE FALLS,NC,12345,
.
.
. continued

このファイルは何千行ものデータを表し、そのすべてを MySQL テーブルに挿入しようとしています。次のステートメントで対応するテーブルを作成しました。

CREATE TABLE customer (
    cust_id INT(7) NOT NULL,
    cust_name VARCHAR(40) NOT NULL,
    cust_add_1 VARCHAR(50) NOT NULL,
    cust_add_2 VARCHAR(50),
    cust_city VARCHAR(20) NOT NULL,
    cust_state CHAR(2) NOT NULL,
    cust_zip INT(5) NOT NULL,
    cust_email VARCHAR(60),
    PRIMARY KEY (cust_id)
);

次に、コマンドラインで次のことを試しました。

msyqlimport -u root --local csv_import ~/path/to/customer.csv

mysqlimport を実行した後に試してみるとSELECT * FROM customer、次の結果セットが表示されました。

+---------+-----------+------------+------------+-----------+------------+----------+------------+
| cust_id | cust_name | cust_add_1 | cust_add_2 | cust_city | cust_state | cust_zip | cust_email |
+---------+-----------+------------+------------+-----------+------------+----------+------------+
|       0 |           |            | NULL       |           |            |          | NULL       |
+---------+-----------+------------+------------+-----------+------------+----------+------------+
1 row in set (0.00 sec)

私は、CSV データを MySQL にインポートする分野ではあまり経験がありません。助けていただければ幸いです。

アップデート

ThisSuitIsBlackNot の回答に従って、次のコマンドを試しました (ところで、--localオプションが必要です)。

mysqlimport -u root --local --fields-terminated-by=',' --fields-optionally-enclosed-by='"' --lines-terminated-by='\n' csv_import ~/path/to/customer.csv

これにより、わずかに良い結果が得られましたが、必要なものではなかったので、次のように試しました。

mysql> LOAD DATA LOCAL INFILE '~/path/to/customer.csv'
    -> INTO TABLE customer
    -> FIELDS TERMINATED BY ','
    -> OPTIONALLY ENCLOSED BY '"'
    -> LINES TERMINATED BY '\n';

これらの両方の後、次のSELECT * FROM customer結果セットが生成されました。

+---------+-----------+------------+------------+-----------+------------+----------+-------------------+
| cust_id | cust_name | cust_add_1 | cust_add_2 | cust_city | cust_state | cust_zip | cust_email        |
+---------+-----------+------------+------------+-----------+------------+----------+-------------------+
100024 |0 | cust_name | cust_add_1 | cust_add_2 | cust_city | cu         | cust_    | cust_email
+---------+-----------+------------+------------+-----------+------------+----------+-------------------+
1 row in set (0.00 sec)

これは明らかに私が必要としているものではありませんが、近づいています。

4

1 に答える 1

2

フィールドセパレータ

のデフォルトのフィールド区切り文字mysqlimportはタブ文字です。mysqlimport代わりにコンマでフィールドを分割するように指示する必要があります。

mysqlimport --fields-terminated-by=',' ...

ただし、CSV が仕様に従っている場合、カンマを含むフィールドは二重引用符で囲まれるため、これだけでは十分ではありません。mysqlimport引用符内のコンマをフィールド区切りとして扱わないように指示する必要があります。

mysqlimport --fields-terminated-by=',' --fields-optionally-enclosed-by='"' ...

一部の CSV では、コンマが含まれているかどうかに関係なく、すべてのフィールドが二重引用符で囲まれています。これはあなたのデータには当てはまりませんが、将来の参考のためにmysqlimport、オプションも提供します

--fields-enclosed-by=string

よくわかりませんが、--fields-enclosed-by='"'代わりに--fields-optionally-enclosed-by='"'.

行区切り

のデフォルトの行区切りmysqlimportは改行\nです。これは、UNIX/Linux/Mac OS X で生成されたファイルで機能するはずですが、ファイルの EOL シーケンスが異なる場合 (たとえば、\r\nWindows で作成されたほとんどのファイル)、それも指定する必要があります。

mysqlimport --lines-terminated-by='\r\n'

どうやら、Wordpad は、Mac OS X より前の Mac と同様に、'\r' を行末として使用します。

列ヘッダーのスキップ

テーブルにはすでに独自の列名があるため、通常、列の名前をテーブルにインポートしたくありません。次のように、ファイルの最初の X 行をスキップできます。

mysqlimport --ignore-lines=X

すべてを一緒に入れて

CSV ファイルをインポートするには

  • コンマを含むフィールドは二重引用符で囲まれています
  • コンマを含まないフィールドは引用されません
  • 行の終わり\r\n
  • 最初の行には、無視したい列名が含まれています

あなたは走るだろう

mysqlimport --fields-terminated-by=',' \
            --fields-optionally-enclosed-by='"' \
            --lines-terminated-by='\r\n' \
            --ignore-lines=1 \
            db_name table_name.csv

mysqlimportファイル拡張子を取り除くだけでインポート先のテーブルを決定することに注意してください。そのため、上記の例ではデータtable_name.csvtable_nameテーブルにインポートしようとします。また、これをサーバー上で実行している場合は、オプションは必要ありません--localが、ドキュメントの文言は少しわかりにくいです。

同等の SQL ステートメントを使用することもできます

LOAD DATA INFILE 'table_name.csv' INTO TABLE table_name
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\r\n'
  IGNORE 1 LINES;

(mysqlimportは への単なるコマンドライン インターフェイスですLOAD DATA INFILE)

詳細については、ドキュメントを参照しLOAD DATA INFILEてください。

于 2013-10-15T21:25:30.927 に答える