Comment Importer automatiquement un fichier cvs dans ma tabl

ViPHP
ViPHP | 1380 Messages

20 avr. 2012, 23:48

Selon la taille du fichier à importer il est préférable d'importer un fichier CSV avec la commande LOAD DATA INFILE, nettement plus rapide qu'une série d'INSERT même préparée avec la classe PDO. Mais il faut que le fichier à importer comporte le même nombre de colonnes que celles crées dans la bdd MySQL. Quant à la discussion plus haut sur la conception de ta bdd, fais ce que tu trouves le plus facile, tu peux toujours par la suite optimiser ta bdd en créant une table ville séparée. L'avantage est, qu'en travaillant de cette manière, un changement dans l'orthographe d'une ville se fera une seule fois dans la table ville et pas de multiples fois dans ta table principale. Mais, une fois encore, commence par le plus facile et optimise selon tes connaissances. Voici en exemple d'optimisation:

Code : Tout sélectionner

/* importation du fichier CSV (à adapter: vois les directives SEPARATED et TERMINATED dans la doc MySQL */ LOAD DATA INFILE "tonfichier.csv" INTO TABLE contacts FIELDS TERMINATED BY ';'; /* optimisation: séparation de la table villes */ /* insertion dans la table villes (vide) de toutes les villes différentes trouvées dans la table contact */ INSERT villes (nom) SELECT contacts.ville FROM contacts GROUP BY contacts.ville; /* remplacement dans la table contacts du nom des villes par leur code de la nouvelle table ville */ UPDATE contacts JOIN villes ON villes.nom=contacts.ville SET contacts.ville=villes.code; /* changement du data type VARCHAR de la colonne ville de la table contact par INT */ ALTER TABLE contatcs CHANGE ville ville INT( 5 ) NOT NULL DEFAULT 0;
L'optimisation est secondaire. Commence par l'import par LOAD DATA INFILE.
ripat

Eléphant du PHP | 106 Messages

21 avr. 2012, 13:56

merci pour les infos :

J'ai trouvé des choses intéressantes aussi à voir selon vous ?
faq-tutoriels/introduction-load-data-infile-t18738.html

QQ'un peut-il m'aider à insérer le code ? voici le nom de ma table : tfi2003_contacts

j'utilise phpmyadmin, en pièce jointe le fichier .csv et ci-dessous mon code php qui fonctionne très bien sous lequel il affiche la requête, mon souhait imoprter automatiquement les données dans le csv vers ma table tfi2003_contacts. MERCI de votre aide les expert php sql ect...

<html>
<body>
<?php
// information pour la connection à le DB
$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'import';

// connection à la DB
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

// requête SQL qui compte le nombre total d'enregistrements dans la table et qui
//récupère tous les enregistrements
$select = 'SELECT prenom,nom,titre,phone,email FROM tfi2003_contacts ';

//$select = 'SELECT prenom,nom FROM vache LIMIT 0,4';

$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$total = mysql_num_rows($result);


// si on a récupéré un résultat on l'affiche.
if($total) {
    // début du tableau
    echo '<table bgcolor="#FFFFFF">'."\n";
        // première ligne on affiche les titres prénom et surnom dans 2 colonnes
        echo '<tr>';
        echo '<td bgcolor="#669999"><b><u>Prénom</u></b></td>';
        echo '<td bgcolor="#669999"><b><u>nom</u></b></td>';
		echo '<td bgcolor="#669999"><b><u>titre</u></b></td>';
        echo '<td bgcolor="#669999"><b><u>phone</u></b></td>';
		echo '<td bgcolor="#669999"><b><u>email</u></b></td>';
		echo '</tr>'."\n";
    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
    while($row = mysql_fetch_array($result)) {
        echo '<tr>';
        echo '<td bgcolor="#CCCCCC">'.$row['prenom'].'</td>';
        echo '<td bgcolor="#CCCCCC">'.$row['nom'].'</td>';
        echo '<td bgcolor="#CCCCCC">'.$row['titre'].'</td>';
		echo '<td bgcolor="#CCCCCC">'.$row['phone'].'</td>';
		echo '<td bgcolor="#CCCCCC">'.$row['email'].'</td>';
		echo '</tr>'."\n";
    }
    echo '</table>'."\n";
    // fin du tableau.
}
else echo 'Pas d\'enregistrements dans cette table...';

// on libère le résultat
mysql_free_result($result);

?>
</body>
</html>    

Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

ViPHP
ViPHP | 1380 Messages

22 avr. 2012, 10:28

Tout d'abord, je vois un premier problème dans ton fichier CSV, sa première colonne est aussi la clé primaire (et donc unique) de la table cible. Un LOAD DATA INFILE produira une erreur logique de DUPLICATE ENTRY dès que MySQL essayera d'insérer une ligne qui aura le même id_contact que celui de la table. Solution: tu supprimes d'abord la première colonne du ficheir CSV et tu précises à MySQL quelles colonnes importer en omettant, bien sûr, la première colonne . La clé primaire de la table contacts étant en auto-increment, tu n'as pas à l'importer spécifiquement. Le second problème (mineur) est que les lignes du CSV se terminent par un retour ligne exotique, du moins différent de celui par défaut de MySQL. Il faut donc le préciser dans l'instructions SQL.
$sql = "
LOAD DATA INFILE '/chemin/complet/vers/tfi2003_contacts.csv'
	INTO table contacts FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n'
	(id_cat,societe,titre,nom,prenom,rue,no,cp,localite,region,pays,phone,phone2,fax,email,website,note)
";

mysql_query($sql) or die (mysql_error());
Attention qu'il te faut le *chemin complet* vers le fichier à importer. Selon que tu travailles en local ou sur un serveur distant, il sera différent. Le mieux est d'uploader le fichier à importer dans le répertoire de ton script d'importation et de spécifier le chemin vers ce répertoire avec la variable serveur $_SERVER['DOCUMENT_ROOT'] à laquelle tu ajoutes le répertoire du script.
ripat

Eléphant du PHP | 106 Messages

22 avr. 2012, 16:14

Merci Ripa pour ton aide sa fonctionne en localhost !

Comment puis-je automatiser ce que je fais manuellement: c'est à dire

1-/exporter le fichier tfi2003_contacts.csv de l'appli source en auto de mon école qui génére un csv après requête manuelle. En simple commander l'export depuis mon appli sans le faire manuellement.

2-/Le faite de générer l'export tfi2003_contacts.csv et enregistrer sous ect... trop long.

je cherche à automatisé ces tâches.

En simple cliquer sur mon bouton puis allez importer tfi2003_contacts.csv ce que je fais manuellement le fichier et le placer au bon endroit exemple chaque matin faire import auto à 8h00.

Merci pour votre aide les pro!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 avr. 2012, 18:02

Le seul moyen de le faire en auto c'est d'avoir un accès quelconque sur l'application qui génère le fichier (par réseau).
La fait voir avec l'éditeur du logiciel.

À partir de la un script php qui récupère le fichier et fait l'insertion.
Ensuite une tâche cron (sous Linux) ou une tâche plannifiée (windows) qui lance le script.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 106 Messages

23 avr. 2012, 22:44

Merci moogli pour l info

Peux-tu détaillé le moyen de le faire en auto ?

--> avoir un accès quelconque sur l'application le seul accès c la barre des taches http:\applicationdemonécole.iut

l appli génère le fichier suite à demande fairte dans l'appli.... comme tte les aplli html ou php etc..

une tâche cron c'est quoi ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 avr. 2012, 12:19

l appli génère le fichier suite à demande fairte dans l'appli.... comme tte les aplli html ou php etc..
ça dépend de ce que l'on appel demande

Un flux RSS c'est quoi ? la même chose en xml, et le xml peu être généré à la demande. et cette demande peux être fait par un script

Au final c'est ce que l'on appel un service web.

S'il n'est pas possible de "piloter" l'application a "distance" ce ne sera pas possible.
si c'est un site web il est peu être possible d’accéder directement a script qui généré le fichier.
dans ce cas il faudra enregistrer temporairement le fichier sur ton site et lancer ce que tu a fait avant.

sinon ben un clic pour avoir le fichier et trois quatre pour l'upload et traitement.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 106 Messages

24 avr. 2012, 21:59

1-/exporter le fichier de l'appli qui génére un csv éviter de la faire à la main :cry: :cry:

2-/le placer au bon endroit exemple chaque matin faire import auto à 8h00. faut il faire un boot sur url=http://ect.... ? je c pas ?

Y a t il un sript pour faire un import dans ma table sans que je sauvegarde à la main le fichier que je demande à l appli de me généré chaque matin (trop de tps de perdu)

merci de votre aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 avr. 2012, 09:17

1/ Seul l'éditeur du soft pourra t'indiqué si cela est possible. a priori c'est du web mais si tu n'a pas la main dessus ce n'est pas la peine (a moins que tu essais de simuler la connexion à l'espace et l'utilisation de la bonne page)
2/La ça dépend de ce que tu peux ou pas avoir, si tu fait le dl à la main effectivement mettre le fichier dans un répertoire précis et utiliser une tache auto (planifiée ou cron) pour lancer le script.

Y a pas de script tous fait pour tout.

Il faut voir avec l'éditeur du soft.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 106 Messages

25 avr. 2012, 23:12

Merci moogli je viens de comprendre :

1-/ Comment le faire en auto c'est d'avoir un accès quelconque sur l'application qui génère le fichier (par réseau).
La fait voir avec l'éditeur du logiciel --> j'utilise googlechrome

Aujourd’hui voici comment je procède je me connecte à http + login je fais l'export
j 'ouvre le fichier je le sauvegarde en csv puis je le place dans mon répertoire localhost (trop long).

2-/ À partir de la un script php qui récupère le fichier et fait l'insertion --> se serait bien mais comment faire ? :(

Ensuite une tâche cron (sous Linux) ou une tâche plannifiée (windows) qui lance le script mais comment faire ? :( j'aimerai bien apprendre

Merci pour votre aide

ViPHP
ViPHP | 1380 Messages

26 avr. 2012, 18:22

Authentification par formulaire donc.

Un seul script devrait suffire mais la promenade risque d'être difficile: curl pour l'émulation de login et de téléchargement suivi par l'insertion dans ta bdd.

Possible mais complexe si tu n'as jamais fait de curl en PHP.
ripat

Eléphant du PHP | 106 Messages

30 avr. 2012, 21:11

Bonjour

comment faire avec le curl ?

Car voici le point que je souhaite améliorer la MàJ manuelle qui est (trop longue)

Description de la problématique:

En simple : j'ai besoin de récupérer des données d'une appli qui tourne sur intranet un fichier csv pour le transférer dans ma table phpmyadmin.

Aujourd’hui voici comment je procède manuellement 1-/je me connecte manuellement 2-/ je fais l'export manuellement 3-/j 'ouvre le fichier manuellement 4-/je le sauvegarde manuellement en csv puis je le place dans mon répertoire localhost manuellement (fastidieux) car 3 fois / jrs

Mon souhait si possible : le faire automatiquement depuis mon appli à partir d 'un bouton sous forme de lien hypertexte html par exemple.
sans le faire manuellement.

ViPHP
ViPHP | 1380 Messages

01 mai 2012, 09:11

Curl va "simplement" émuler l'envoi du formulaire de login en POST, stocker le cookie de session et ensuite faire le téléchargement du fichier. J'ai mis des guillemets à "simplement" car il te faudra:
  • analyser les sources de la page de login
  • extraire *tous* les champs input avec leurs attributs
  • faire la même chose sur la page téléchargement (ici ce sera peut-être un simple GET)
  • mettre tout ça en musique avec php-curl
Impossible à tester si on a pas ton login. Tu te retrouves donc un peu seul pour valider tes tentatives. Cherche sur Google des exemples de l'envoi de formulaires par php-curl. En précisant:
php curl formulaire session cookie
php curl form session cookie
ripat