Page 1 sur 1

Soucis injection fichier csv dans sql

Posté : 20 août 2007, 14:49
par henki
Bonjour,

Je recois chaque jour un fichier csv. J'aimerai l'importer dans une table sql.

Pour le moment j'arrive a le faire mais j'ai 2 soucis :

* La 1ere ligne du csv contient toujours les noms des colonnes. Du coup lors de l'insertion, je me retrouve avec cette ligne ..
Comment faire pour que l'insertion ne demarre qu'a partir de la 2nde ligne ??

* Le csv contient les 1000 derniers enregistrements d'une application. Or certains jours il y a moins de 1000 enregistrements effectué. Du coup, je me retrouve avec des données datant de la journée n-1. Ce qui me genere donc des doublons dans ma mdb.
Comment Verifier qu'il n'y a pas de doublon en utilisant la date&heure (1er champs de mon csv) ??

Voici la commande que j'utilise pour le moment :

$sql = 'LOAD DATA LOCAL INFILE ''import.csv'' INTO TABLE `import` FIELDS TERMINATED BY '','' ENCLOSED BY ''"'' ESCAPED BY ''\\\\'' LINES TERMINATED BY ''\\r\\n''';


Merci.

Posté : 20 août 2007, 14:58
par Yosh
Salut,

Pour importer un fichier CSV et pouvoir faire des traitements tu peux utiliser la fonction fopen pour ouvrir le fichier CSV.

Ensuite il te suffit de parcourir ligne par ligne le fichier, te permettant ainsi de sauter la première ligne et des faire tes tests sur les doublons.

Posté : 20 août 2007, 15:04
par zeus
Comme indiqué dans ce tuto, il existe des options de l'instruction LOAD DATA INFILE qui permettent de faire ce que tu demandes :

1/ ignorer la 1ere ligne

Code : Tout sélectionner

IGNORE x LINES
Où X est le nombre de lignes à ignorer.

2/ Ne pas doublonner les lignes
L’ajout du mot clé « REPLACE » permet d’indiquer à la requête d’écraser la ligne existante pour la remplacer par les nouvelles valeurs
Il est également possible de spécifier « IGNORE » plutôt que « REPLACE ». Dans ce cas là, les données existantes seront conservées.
Je t'invite à consulter le tuto pour plus de détails ;)

Posté : 20 août 2007, 15:51
par henki
Merci pour le lien, je n'avais pas vu ce tuto :)

Pour la fonction replace ca marche nickel, par contre pour IGNORE cela ne tourne pas correctement :

LOAD DATA LOCAL INFILE 'export' REPLACE INTO TABLE `export`
FIELDS TERMINATED BY ','
IGNORE 1 LINES

Sql ne me met aucune erreur, tout semble ok, mais lorsque j'interroge la table, elle est vide.
Comme si rien ne s'était passé

Posté : 20 août 2007, 16:03
par zeus
Je ne connait pas la structure de ta table, mais l'option IGNORE se base sur la clé primaire de ta table. Si elle va insérer un enregistrement dont la clé primaire est déjà présente dans la base de données, elle ne l'inserts pas.

Posté : 20 août 2007, 16:18
par henki
Débutant totalement je ne savais pas quoi mettre en clee primaire. il n'y en a donc pas :oops:

Posté : 20 août 2007, 16:25
par zeus
Une clé primaire, c'est un champ ou un groupe de champ dont la combinaison sera complètement unique dans la table.

Imaginons que tu ne veuilles qu'une seule ligne par jour et par produits, ta clé primaire sera un champ date contenant une date au format "jour" et un champ contenant l'identifiant d'un produit.

Mais si tu n'a pas de clé primaire, LOAD DATA INFILE ne pourra fonctionner correctement ;)