У меня есть ненормализованные события - дневной CSV от клиента, который я пытаюсь загрузить в таблицу MySQL, чтобы я мог реорганизовать в нормальный формат. Я создал таблицу под названием "CSVImport", которая имеет одно поле для каждого столбца файла CSV. 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), за исключением столбцов, которые содержат count (представлены INT), yes/no (представлены BIT), цены (представленные DECIMAL) и текстовые объявления (представлены текстом).
Я попытался загрузить данные в файл:
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 анализирует файл так, как если бы каждая новая строка соответствовала одной строке базы данных. Я могу загрузить файл в OpenOffice без проблем.
Файл clientdata.csv содержит 2593 строки и 570 записей. Первая строка содержит имена столбцов. Я думаю, что он разделен запятыми, и текст, по-видимому, ограничен с помощью doublequote.
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
записей, и ни одна из данных, которые загружены, кажется, находится в нужном месте.