正規化されていないイベントがあります。MySQLテーブルにロードしようとしているクライアントからの日記CSVで、正常な形式にリファクタリングできます。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);
テーブルに制約はなく、すべてのフィールドはVARCHAR(256)値を保持します。ただし、カウント(INTで表される)、yes / no(BITで表される)、価格(DECIMALで表される)、およびテキストの宣伝文句( TEXTで表されます)。
ファイルにデータをロードしようとしました:
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
です。
問題は、テキストの宣伝文句に複数の行が含まれていて、MySQLが新しい各行が1つのdatabazse行に対応するかのようにファイルを解析していることだと思います。ファイルをOpenOfficeに問題なくロードできます。
clientdata.csvファイルには、2593行と570レコードが含まれています。最初の行には列名が含まれています。カンマで区切られていると思いますが、テキストは明らかに二重引用符で区切られています。
アップデート:
疑問がある場合は、マニュアルを読んでください: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
しかし、それでも完全なレコードはたくさんあり、ロードされたデータはどれも適切な場所にないようです。