Soucis injection fichier csv dans sql

Petit nouveau ! | 3 Messages

20 août 2007, 14:49

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.

Mammouth du PHP | 568 Messages

20 août 2007, 14:58

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2007, 15:04

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 3 Messages

20 août 2007, 15:51

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é

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2007, 16:03

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 3 Messages

20 août 2007, 16:18

Débutant totalement je ne savais pas quoi mettre en clee primaire. il n'y en a donc pas :oops:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 août 2007, 16:25

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer