Eu tenho um CSV de diário de eventos não normalizado de um cliente que estou tentando carregar em uma tabela MySQL para que eu possa refatorar em um formato saudável. Criei uma tabela chamada 'CSVImport' que possui um campo para cada coluna do arquivo CSV. O CSV contém 99 colunas, portanto, essa foi uma tarefa bastante difícil:
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);
Não há restrições na tabela e todos os campos mantêm valores VARCHAR (256), exceto as colunas que contêm contagens (representadas por INT), sim / não (representadas por BIT), preços (representados por DECIMAL) e sinopse de texto ( representado por TEXT).
Eu tentei carregar dados no arquivo:
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 |
...
A mesa inteira está cheia NULL
.
Eu acho que o problema é que os anúncios de texto contêm mais de uma linha, e o MySQL está analisando o arquivo como se cada nova linha correspondesse a uma linha do banco de dados. Eu posso carregar o arquivo no OpenOffice sem problemas.
O arquivo clientdata.csv contém 2593 linhas e 570 registros. A primeira linha contém nomes de colunas. Eu acho que é delimitado por vírgula, e o texto é aparentemente delimitado com aspas duplas.
ATUALIZAR:
Em caso de dúvida, leia o manual: http://dev.mysql.com/doc/refman/5.0/en/load-data.html
Adicionei algumas informações à LOAD DATA
declaração de que o OpenOffice era inteligente o suficiente para inferir e agora carrega o número correto de registros:
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;
Mas ainda existem muitos NULL
registros completos e nenhum dos dados que foram carregados parece estar no lugar certo.