1. ホーム
  2. mysql

[解決済み] CSVファイルをMySQLのテーブルにインポートするには?

2022-03-16 22:28:13

質問内容

クライアントからの非正規化されたイベントダイアリーのCSVがあり、それをMySQLのテーブルにロードして、まともなフォーマットにリファクタリングしようとしています。CSVファイルの各カラムに1つのフィールドを持つ'CSVImport'というテーブルを作成しました。CSVには99のカラムがあるので、これだけでも十分大変な作業だった。

CREATE TABLE 'CSVImport' (id INT);
ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
...
ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);

テーブルには制約がなく、カウント(INTで表現)、yes/no(BITで表現)、価格(DECIMALで表現)、テキストぼかし(TEXTで表現)を含む列を除いて、すべてのフィールドがVARCHAR(256)値を保持しています。

ファイルにデータを読み込もうとしました。

LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
Records: 2023  Deleted: 0  Skipped: 0  Warnings: 198256
SELECT * FROM CSVImport;
| NULL             | NULL        | NULL           | NULL | NULL               | 
...

テーブル全体が NULL .

問題は、テキストが2行以上あり、MySQLが新しい行が1つのデータベース行に対応するようにファイルをパースしていることだと思います。OpenOfficeには問題なくファイルを読み込むことができます。

clientdata.csvファイルには2593行、570レコードが含まれています。最初の行はカラム名を含んでいます。カンマ区切りで、テキストはダブルクオートで区切られているようですね。

UPDATE

迷ったら、マニュアルを読もう。 http://dev.mysql.com/doc/refman/5.0/en/load-data.html

に情報を追加してみました。 LOAD DATA ステートメントを使用すると、OpenOffice は十分に賢く推論し、正しい数のレコードを読み込むことができます。

LOAD DATA INFILE "/home/paul/clientdata.csv"
INTO TABLE CSVImport
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

しかし、まだ完全にたくさんある NULL のレコードがあり、読み込まれたデータのどれもが正しい場所にないように見えます。

どうすればいいですか?

問題の核心は、CSVファイルのカラムとテーブルのカラムを一致させることにあるようです。

多くのグラフィカルなmySQLクライアントには、このようなことを行うための非常に優れたインポートダイアログがあります。

私のお気に入りは、Windowsベースの ハイディエスキューエル . グラフィカルなインターフェースで LOAD DATA このコマンドは後でプログラム的に再利用することができます。

スクリーンショット: "テキストファイルのインポート"ダイアログ

テキストファイルのインポート(Import textfile")]ダイアログを開くには Tools > Import CSV file :