Mam nienormalizowany dziennik zdarzeń CSV od klienta, który próbuję załadować do tabeli MySQL, abym mógł przefakturować go do rozsądnego formatu. Utworzyłem tabelę o nazwie „CSVImport”, która ma jedno pole dla każdej kolumny pliku CSV. Plik CSV zawiera 99 kolumn, więc samo w sobie było to dość trudne zadanie:
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);
Tabela nie zawiera żadnych ograniczeń, a wszystkie pola zawierają wartości VARCHAR (256), z wyjątkiem kolumn zawierających liczby (reprezentowane przez INT), tak / nie (reprezentowane przez BIT), ceny (reprezentowane przez DECIMAL) i blurb tekstowy ( reprezentowany przez TEKST).
Próbowałem załadować dane do pliku:
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 |
...
Cały stół jest wypełniony NULL
.
Myślę, że problem polega na tym, że blobty tekstowe zawierają więcej niż jedną linię, a MySQL analizuje plik tak, jakby każda nowa linia odpowiadała jednemu wierszowi bazy danych. Mogę bez problemu załadować plik do OpenOffice.
Plik clientdata.csv zawiera 2593 wierszy i 570 rekordów. Pierwszy wiersz zawiera nazwy kolumn. Myślę, że jest rozdzielany przecinkami, a tekst jest najwyraźniej rozdzielany podwójnym cudzysłowem.
AKTUALIZACJA:
W razie wątpliwości przeczytaj instrukcję: http://dev.mysql.com/doc/refman/5.0/en/load-data.html
Dodałem trochę informacji do LOAD DATA
stwierdzenia, że OpenOffice był wystarczająco inteligentny, aby wnioskować, a teraz ładuje prawidłową liczbę rekordów:
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;
Ale nadal istnieje wiele całkowicie NULL
zapisów i żadne z załadowanych danych nie wydają się być odpowiednie.