У меня есть ненормализованный дневник событий 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), кроме столбцов, которые содержат счетчики (представленные как INT), да / нет (представленные как 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 записей. Первая строка содержит имена столбцов. Я думаю, что он разделен запятыми, а текст, очевидно, разделен двойной кавычкой.
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
записей, и ни одна из загруженных данных, кажется, не в нужном месте.