J'ai un fichier CSV de journal d'événements non normalisé d'un client que j'essaie de charger dans une table MySQL afin qu'il puisse être reconstruit dans un format normal. J'ai créé une table appelée "CSVImport" avec un champ pour chaque colonne du fichier CSV. Le CSV contient 99 colonnes, c'est donc une tâche ardue en soi :
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);
Il n'y a aucune contrainte sur la table, tous les champs contiennent des valeurs VARCHAR(256) sauf count (représenté par INT), oui/non (représenté par BIT), prix (représenté par DECIMAL) et description textuelle (représentée par TEXT) .
J'ai essayé de charger les données dans un fichier :
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 | ...
La table entière est remplieNULL
.
Je pense que le problème est que l'introduction du texte contient plus d'une ligne et que MySQL analyse le fichier comme si chaque nouvelle ligne correspondait à une ligne de la base de données. Je peux charger le fichier dans Open sans aucun problème.
Le fichierclientdata.csv contient 2593 lignes et 570 enregistrements. La première ligne contient les noms de colonnes. Je pense qu'il est délimité par des virgules et le texte est évidemment délimité par des guillemets doubles.
Mise à jour :
Si vous avez des questions, veuillez lire le manuel : http://dev.mysql.com/doc/refman/5.0/en/load-data.html
J'ai ajouté quelques informations à la déclarationLOAD DATA
, suffisamment intelligentes pour en déduire, et maintenant elle charge le nombre correct d'enregistrements :
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;
Mais il y a encore beaucoup d'enregistrements complètementNULL
, et aucune des données chargées ne semble être au bon endroit.
Utilisezmysqlimportpour charger la table dans la base de données : p>
Je l'ai trouvé surhttp://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/
Pour faire du séparateur un onglet, utilisez
--fields-termerated-by='t'
Le cœur du problème semble être la correspondance des colonnes du fichier CSV avec les colonnes du tableau.
De nombreux clients graphiques MySQL ont de très belles boîtes de dialogue d'importation pour ce genre de choses.
Mon travail préféré est basé sur WindowsHeidiSQL. Il vous fournit une interface graphique pour créer des commandes
LOAD DATA
; vous pourrez ensuite la réutiliser par programme.Capture d'écran : boîte de dialogue "Importer un fichier texte"
Pour ouvrir la boîte de dialogue Importer un fichier texte, accédez à
工具 > 导入 CSV 文件
: