クライアントから受け取った、正規化されていないイベント ダイアリー 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 で表される)、はい/いいえ (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
。
問題は、テキストの説明文に複数の行が含まれており、MySQL が各行が 1 つのデータベース行に対応するかのようにファイルを解析していることだと思います。問題なく OpenOffice にファイルを読み込むことができます。
clientdata.csv ファイルには 2593 行、570 レコードが含まれています。最初の行には列名が含まれています。これはコンマで区切られており、テキストは二重引用符で区切られているようです。
アップデート:
疑問がある場合は、マニュアルをお読みください。ロードデータ
OpenOffice が十分に賢く推測できるという情報をステートメントに追加したところLOAD DATA
、正しい数のレコードが読み込まれるようになりました。
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
レコードが存在し、ロードされたデータはどれも正しい場所にないようです。
ベストアンサー1
使用mysqlインポートテーブルをデータベースにロードするには:
mysqlimport --ignore-lines=1 \
--fields-terminated-by=, \
--local -u root \
-p Database \
TableName.csv
私はそれを見つけたhttp://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/
区切り文字をタブにするには、--fields-terminated-by='\t'