Page 1 sur 3
Insertion complexe de de données provenant d'un fichier txt
Posté : 26 mai 2005, 11:14
par BFH
Bonjour,
Je desirerais inserer des données provenant d'un fichier texte dans une table mais de manière assez complexe.
Les données du fichier texte sont séparées par des "
;" et les lignes terminées par des retour à la ligne. Je sais que une partie du code est :
INTO TABLE ' [i]Nom_De_La_Table[/i] ' FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' ( "[i] nom des champs que l'on souhaite compléter [/i]")
Mais je ne sais pas ce qui va avant ! Si quelqu'un sait merci de me le dire.
Posté : 26 mai 2005, 11:27
par mere-teresa
Pourquoi ne pas utiliser les fonctions PHP de traitement de fichiers textes (lecture, ouverture) pour construire une requête plus simple ?
1 - tu lis le fichier
2 - tu parses chaque ligne pour récupérer les donées à insérer
3- une boucle PHP te permet de construire à chaque fois ta requête
4 - tu fais une sortie pour voir le nb de champs insérés.
Mon conseil : Fais d'abord des echo $requete; avant de les poser réellement.
Posté : 26 mai 2005, 11:49
par BFH
Euh, plus simple pout toi peut être, mais honnetement moi je ne vois pas de quoi tu parle
Et puis là, le bout de code que je demande n'est que pour réaliser la partie facile de l'insertion. La programmation vraiment complexe n'arrivera qu'après.
Des trucs du style: Supprimer la première ligne du fichier texte, inserer la ligne n°2 à tel et tel endroit, la N° 7 à un autre endroit, etc ...
Mais bon l'important pour moi est d'avoir le code qui permet de réaliser une insetion simple.
Posté : 26 mai 2005, 11:57
par Cyrano
Justement, la suggestion de mere-theresa est pleine de bon sens: avec les fonctions de lecture de fichier, tu peux faire de la lecture ligne par ligne: pour chaque ligne, tu fais un explode() pour entrer tes valeurs dans un tableau à deux dimensions $tableau['index_ligne']['index_champ']
Ensuite, dans une boucle, pour chaque ligne d'un index_ligne, tu crées une requête d'insertion en oubliant pas de mettre un ";" à la fin de la requête et tu enregistres cette requête dans une variable $requête
Après, pour vérifier, tu fais un var_dump() de ce tableau pour vérifier le résultat et si c'est satisfaisant, tu exécutes la requête et basta, c'est terminé et plus simple qu'une requête complexe.
Posté : 26 mai 2005, 13:59
par BFH
Donc, si j'ai bien compris, sur une page je vais avoir:
<FORM METHOD="GET" ACTION="Insertion.php">
<INPUT TYPE="file" name="FI">
Et sur la page Insertion.php
while (!feof($FI)){
$query = fgets($FI,4096); // je ne sais pas a quoi sert le 4096 !!
$result=explode(";",$query);
$nom = $result[0];
$email = $result[1];
$insert="INSERT INTO Nom_De_La_Table (nom_de_la_colone_choisie)";
mysql_query($insert)
$nom = $result[0]; signifie que tout ce qui est dans la colone n°1 est stocké dans la variable $nom ?? ou bien jue suis complétement a l'ouest?

Posté : 26 mai 2005, 15:57
par BFH
J'ai essayé de faire comme écris dans le tutorial
Fichiers, 3- Lecture du fichier mais cela ne fonctionne pas chez moi.
Il est ecrit:
feof(): supplied argument is not a valid stream ressource in chemin du fichier on line XX
fgets(): supplied argument is not a valid stream ressource in chemin du fichier on lineXX'
Posté : 26 mai 2005, 17:11
par mere-teresa
Quel est le code incriminé à la ligne ?
Mon conseil : vérifie le chemin du fichier.
Posté : 26 mai 2005, 17:26
par sadeq
En fait BFH, tu étais sur la bonne voie dès le départ : LOAD DATA INFILE est la meilleurs méthode pour transferer des fichiers dans des tables de BDD.
Le seul petit souci avec cette méthode est qu'il faut désigner le chemin absolu du fichier source (un chemin relatif pointe par défaut sur le dossier DATA de MYSQL) mais ce n'est pas un problème.
Soit tu place ton fichier source dans le dossier DATA de MYSQL ou tu donne le chemin complet sur le disque.
Voici un exemple:
<?
//Récupérer la variable d'environement PATH
$path = getenv("PATH");
$path = explode(";",$path);
//se connecter à MYSQL
$mysql_link = @mysql_connect("localhost","root","") or die("<p>Impossible de se connecter au serveur!");
//Exécuter SQL
//Créer la table blagues si elle n'existe pas
$sql="CREATE TABLE blagues (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, blague TEXT NOT NULL);";
mysql_db_query("test", $sql);
//Le chemin par défaut du fichier est c: sinon le programme cherche dans la liste path avant d'abondonner
$chemin="c:";
$resultat = false; $chemin_non_trouvé = true; $p=0;
while ($chemin_non_trouvé && !$resultat && $p < count($path)){
//Le fichier contient des blagues séparées par un # et qui peuvent s'étendre sur plusieurs lignes
//Le champs à renseigner est blague l'id est automatique
$sql = "LOAD DATA INFILE \"$chemin/blagues.txt\" INTO TABLE blagues
FIELDS TERMINATED BY \"\"
LINES TERMINATED BY \"\\r\\n#\\r\\n\" (blague);
";
$resultat = mysql_db_query("test", $sql);
if (mysql_errno() == 1105) { //fichier non trouvé
$chemin_non_trouvé = true;
$chemin = addslashes($path[$p]);
echo "<br>Recherche dans $chemin";
$p++;
}else $chemin_non_trouvé = false;
}
//Test du résultat
if (!$resultat) echo "<p>La requête n'est pas exécutée";
else echo "<p>Transfert de fichier dans la base de données effectué.";
?>
Extrait du fichier source "c:/blagues.txt"
Hihi hi
#
Hahaha haha
#
Aaaaaaa Hihi Hihi
Posté : 26 mai 2005, 17:34
par mere-teresa
En fait BFH, tu étais sur la bonne voie dès le départ : LOAD DATA INFILE est la meilleurs méthode pour transferer des fichiers dans des tables de BDD.
Pourvu qu'ils soient formatés !
edit : je disais ça pour les lecteurs du post qui auraient le mm problème.
Re: Insertion complexe de de données provenant d'un fichier
Posté : 27 mai 2005, 08:38
par BFH
Si on lit attentivement mon premier post on voit que mes données sont bien formatées!
INTO TABLE ' [i]Nom_De_La_Table[/i] ' FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' ( "[i] nom des champs que l'on souhaite compléter [/i]")
Posté : 27 mai 2005, 11:31
par Cyrano
Corrigez moi si je dis une conn****, il manquerait pas VALUES ? dans la requête juste avant la liste des valeurs à enregistrer dans la table ?
Ce qui donnerait :
INTO TABLE ' Nom_De_La_Table ' FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' VALUES (" nom des champs que l'on souhaite compléter")
Posté : 27 mai 2005, 12:35
par sadeq
La commande ne commence pas par INTO TABLE, elle commence par LOAD DATA INFILE "mon fichier" INTO TABLE matable
FIELDS TERMINATED BY ...
LINES TERMINATED BY ...
Mais jamais de VALUES
Posté : 27 mai 2005, 12:37
par Cyrano
Ok , autant pour moi, je ne connais pas LOAD DATA File, c'était juste une idée, faut que j'explore ce système.

Posté : 27 mai 2005, 15:55
par BFH
Je savais qu'il manquait quelquechose avant INTO TABLE, je l'ai ecris dans mon premier post! 8)
Maintenant j'ai :
"LOAD DATA INFILE '".$FI."' INSERT INTO TABLE item FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n\r' (INum,IPage,IDevice,IGroup,IValue,IID) ";
Ok, donc ça c'est cool, c'est le programme de base que je désirais.
Mantenant comment je fais pour ignorer la ligne N°1 du fichier texte dont l'adresse absolue est contenue dans $FI ? Et comment je fais pour que la ligne N°10 soit inscrite dans la table
report
Posté : 27 mai 2005, 16:36
par mere-teresa
Mantenant comment je fais pour ignorer la ligne N°1 du fichier texte dont l'adresse absolue est contenue dans $FI ? Et comment je fais pour que la ligne N°10 soit inscrite dans la table report
Je n'ai jamais LOAD DATA INFILE, donc je ne veux pas dire de bêtises, mais pour justement repérer les lignes, ce que je te proposais était pratique (pour mémoire : lire le fichier avec les fonctions PHP).
Sinon tu formates ces lignes un poil différemment :
L'option IGNORE nombre LINES sert à ignorer une en-tête de fichier, telle que des noms de colonnes, qui débutent parfois un fichier à charger :
mysql> LOAD DATA INFILE "/tmp/nom_fichier" INTO TABLE test IGNORE 1 LINES;
Lorsque vous utilisez SELECT ... INTO OUTFILE conjointement avec LOAD DATA INFILE pour écrire des données dans un fichier et les relire dans une table, les options de FIELDS et LINES doivent être identiques. Sinon, LOAD DATA INFILE ne pourra pas interpréter le contenu du fichier correctement.
source : http://www.nexen.net/docs/mysql/annotee/load-data.php