Lire dans un fichier et recuperer du contenu
ladj59
Messages postés
322
Date d'inscription
Statut
Membre
Dernière intervention
-
sly-bzh Messages postés 415 Date d'inscription Statut Membre Dernière intervention -
sly-bzh Messages postés 415 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j'ai un ficher .txt de la forme suivante:
<au> james
<au>robert
<ti>les atomes
<page> 4
et je voudrais (en php si possible) pouvoir lire ce fichier texte et retranscrire ce qui est lu sous la forme : james-robert,les atomes,4
en gros il faut faire while la ligne commence par <au> ca représente ce qu'il y a avant la 1ere , ...
mais je ne sais pas comment faire ni quelles fonctions utilisées...
est-ce que quelqu'un a une idée?
j'ai un ficher .txt de la forme suivante:
<au> james
<au>robert
<ti>les atomes
<page> 4
et je voudrais (en php si possible) pouvoir lire ce fichier texte et retranscrire ce qui est lu sous la forme : james-robert,les atomes,4
en gros il faut faire while la ligne commence par <au> ca représente ce qu'il y a avant la 1ere , ...
mais je ne sais pas comment faire ni quelles fonctions utilisées...
est-ce que quelqu'un a une idée?
A voir également:
- Lire dans un fichier et recuperer du contenu
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire un fichier epub - Guide
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
17 réponses
Bonojur,
tu peux toujours utiliser les expressions régulières. Je te donne un p'tit exemple :
Après, je suppose que tu as de nombreuses lignes comme celle là... Sinon tu ne te ferais pas ch... pour rien n'est ce pas.
Donc tu peux créer une boucle très rapidement, regarde la structure du tableau créé pour voir comment la faire
tu peux toujours utiliser les expressions régulières. Je te donne un p'tit exemple :
$contenuFichier = file_get_contents("ton_fichier.txt"); $expressionRationnelle = "#<au>([a-zA-Z ]*)\r\n<au>([a-zA-Z ]*)\r\n<ti>([a-zA-Z ]*)\r\n<page>([0-9 ]*)\r\n#"; $resultat = Array(); preg_match_all($expressionRationnelle, $contenuFichier, $resultat, PREG_PATTERN_ORDER); // On affiche le tableau pour voir si tout se passe bien echo "<pre>"; print_r($resultat); echo "</pre>"; echo $resultat[1][0]."-".$resultat[2][0].", ".$resultat[3][0].", ".$resultat[4][0];
Après, je suppose que tu as de nombreuses lignes comme celle là... Sinon tu ne te ferais pas ch... pour rien n'est ce pas.
Donc tu peux créer une boucle très rapidement, regarde la structure du tableau créé pour voir comment la faire
Bonjour, désolé de répondre plus tard
Je vais essayer de t'expliquer plus précisemment mais je risque de ne pas être très clair. Si tu ne comprend pas tu pourra toujours aller voir sur un site de tuto...
Donc :
<au> : commence par "<au>"
[a-zA-Z]* : tu as ensuite un certain nombre (*) de lettres minuscules ou majuscules
\r\n : on a ensuite un retour a la ligne
<ti> : ensuite on a une balise "<ti>"
etc...
[0-9]* : tu as un certains nombre de chiffres
les parenthèses permettent de sélectionner certaines parties du texte, dans le cas qui nous intéresse, il s'agit de "james", puis "robert" puis "les atomes" et enfin "4"
Et bien évidemment, tout cela ne fonctionnera QUE si la structure de ton texte est rigoureusement la même durant tout ton texte
J'espère avoir été clair, sinon n'hésites pas à demander des précisions
Je vais essayer de t'expliquer plus précisemment mais je risque de ne pas être très clair. Si tu ne comprend pas tu pourra toujours aller voir sur un site de tuto...
Donc :
$contenuFichier = file_get_contents("ton_fichier.txt");Tu charges le contenu de ton fichier .txt dans une variable. Ce fichier doit être dans le même dossier que ton script php, sinon tu dois inscrire le chemin depuis le dossier dans lequel se situe ton script php
$expressionRationnelle = "#<au>([a-zA-Z ]*)\r\n<au>([a-zA-Z ]*)\r\n<ti>([a-zA-Z ]*)\r\n<page>([0-9 ]*)\r\n#";Je suppose que c'est cette partie que tu n'as pas bien comprise. C'est elle l'expression régulière. En gros ça va rechercher dans ton fichier .txt toutes les écritures ayant la structure suivante :
<au> : commence par "<au>"
[a-zA-Z]* : tu as ensuite un certain nombre (*) de lettres minuscules ou majuscules
\r\n : on a ensuite un retour a la ligne
<ti> : ensuite on a une balise "<ti>"
etc...
[0-9]* : tu as un certains nombre de chiffres
les parenthèses permettent de sélectionner certaines parties du texte, dans le cas qui nous intéresse, il s'agit de "james", puis "robert" puis "les atomes" et enfin "4"
$resultat = Array();On crée une variable $resultat qui est un tableau
preg_match_all($expressionRationnelle, $contenuFichier, $resultat, PREG_PATTERN_ORDER);On va insérer dans le tableau $resultat les valeurs recueillies par l'expression régulière
echo "<pre>"; print_r($resultat); echo "</pre>";On affiche le tableau qui a été créé afin de vérifier que le tout a correctement fonctionné. Bien évidemment, dès que ça marche tu supprimes ces libres qui ne servent que de "débuggage" si bug il y a...
echo $resultat[1][0]."-".$resultat[2][0].", ".$resultat[3][0].", ".$resultat[4][0];On affiche enfin les valeurs du tableau qui nous intéressent. Si tu veux afficher d'autres valeurs que "james-robert, les atomes, 4" c'est à cet endroit que tu devra insérer ta boucle :
$i=0; while ($i<nombre_d'entrées_que_tu_souhaites_étudier) { echo $resultat[1][$i]."-".$resultat[2][$i].", ".$resultat[3][$i].", ".$resultat[4][$i]."<BR />"; $i++; }
Et bien évidemment, tout cela ne fonctionnera QUE si la structure de ton texte est rigoureusement la même durant tout ton texte
J'espère avoir été clair, sinon n'hésites pas à demander des précisions
ok j'ai essayé cela marche bien
en revanche, il y a un probleme qu'il faudrait gérer qui est le suivant :
on ne sait pas à l'avance combien il y a de <au>, <ti>... dans le fichier .txt donc il faudrait que dans le expressionrationnelle cela s'adapte en fonction de ce nombre, de meme pour l'affichage du resultat il faut qu'il s'adapte en fonction du nombre de <au>,<ti>...
merci d'avance
en revanche, il y a un probleme qu'il faudrait gérer qui est le suivant :
on ne sait pas à l'avance combien il y a de <au>, <ti>... dans le fichier .txt donc il faudrait que dans le expressionrationnelle cela s'adapte en fonction de ce nombre, de meme pour l'affichage du resultat il faut qu'il s'adapte en fonction du nombre de <au>,<ti>...
merci d'avance
Si je comprend bien, parceque je vais pas non plus bosser pour rien ;-)
Ton fichier .txt peut par exemple être ainsi :
<au> james
<au>robert
<ti>les atomes
<page> 4
<au> moi
<au> monnom
<ti> l'expression de l'aromatase alcaline bovine dans les cellules placentaires droguées à la tertadotoxine
<ti> volume 3
<page> 76
etc...
Et tout ça toujours dans le même ordre : <au> puis <ti> puis <page>?
Ton fichier .txt peut par exemple être ainsi :
<au> james
<au>robert
<ti>les atomes
<page> 4
<au> moi
<au> monnom
<ti> l'expression de l'aromatase alcaline bovine dans les cellules placentaires droguées à la tertadotoxine
<ti> volume 3
<page> 76
etc...
Et tout ça toujours dans le même ordre : <au> puis <ti> puis <page>?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Euh ouais on va faire ça parceque là aujourd'hui et demain je serais débordé...
donc le tuto de m@teo du site du zéro sur le php contient une partie sur les expressions régulières il me semble.
Si j'ai le temps j'essayerais de regarder mais là franchement pas le temps, désolé
donc le tuto de m@teo du site du zéro sur le php contient une partie sur les expressions régulières il me semble.
Si j'ai le temps j'essayerais de regarder mais là franchement pas le temps, désolé
ok je vais essayer de regarder la j'ai essayé un truc mais je comprends pas ca ne marche pas car cela m'affiche meme les lignes qui commencent par <ti> si quelqu'un sait pourquoi
<?php
$forme = "#<au>([a-zA-Z ]*)\r\n#";
if (!$fp = fopen("essai/essai.txt","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}
else {
while(!feof($fp)) {
$Ligne = fgets($fp,255);
if($forme) {
$Fichier .= $Ligne;
}
}
fclose($fp);
}
echo $Fichier;
?>
<?php
$forme = "#<au>([a-zA-Z ]*)\r\n#";
if (!$fp = fopen("essai/essai.txt","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}
else {
while(!feof($fp)) {
$Ligne = fgets($fp,255);
if($forme) {
$Fichier .= $Ligne;
}
}
fclose($fp);
}
echo $Fichier;
?>
Je pense que tu n'as pas bien compris le fonctionnement général :( ... Par contre ton expression régulière est bonne :D (le $forme)
Mais ton if ($forme) ne veut absolument rien dire, tu cherches si $forme... Ce qui est complètement idiot étant donné que tu déclares $forme avant, dans tout les cas $forme existe.
En fait le problème dans le cas précis est que tu n'utilises tout simplement pas à un seul endroit dans ton script les expressions régulières.
Normalement pour ce soir (je considère le soir comme jusqu'à 3-4H du mat') je t'aurais fait un truc potable, pas forcément beau mais ça devrait marcher (faut juste que je trouve le temps de m'y mettre)
Mais ton if ($forme) ne veut absolument rien dire, tu cherches si $forme... Ce qui est complètement idiot étant donné que tu déclares $forme avant, dans tout les cas $forme existe.
En fait le problème dans le cas précis est que tu n'utilises tout simplement pas à un seul endroit dans ton script les expressions régulières.
Normalement pour ce soir (je considère le soir comme jusqu'à 3-4H du mat') je t'aurais fait un truc potable, pas forcément beau mais ça devrait marcher (faut juste que je trouve le temps de m'y mettre)
j'ai fait ca ca marche a peu prés mais j'ai un probleme (voir aprés le code)
<?php
if (!$fp = fopen("essai/essai.txt","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}
else {
while(!feof($fp)) {
$Ligne=fgets($fp,4096);
if(ereg("^<au>",$Ligne)){
echo $Ligne;
echo "-";
}
if(ereg("^<ti>",$Ligne)){
echo $Ligne;
echo ";";
}
if(ereg("^<pa>",$Ligne)){
echo $Ligne;
echo ";";
}
if(ereg("^<an>",$Ligne)){
echo "(";
echo $Ligne;
echo ")";
}
}
}
?>
en revanche j'ai besoin de faire une autre
chose , en effet, quand je passe de <au>
à <ti>, le signe entre les deux doit changer.
Or dans ce que j'ai fait,cela met a chaque
fois un signe en trop. Il faudrait que je fasse
un truc du genre while(a la ligne d'après il y
a <au> echo "-") et quand cela change alors on
echo autre chose ou alors je ferai un autre
echo dans le if suivant(if <ti>)..
exemple avec ce code a un moment je me retrouve
avec un ;( alors que je ne veux pas du dernier ;
j'espere etre assez clair..
merci de votre aide...
<?php
if (!$fp = fopen("essai/essai.txt","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}
else {
while(!feof($fp)) {
$Ligne=fgets($fp,4096);
if(ereg("^<au>",$Ligne)){
echo $Ligne;
echo "-";
}
if(ereg("^<ti>",$Ligne)){
echo $Ligne;
echo ";";
}
if(ereg("^<pa>",$Ligne)){
echo $Ligne;
echo ";";
}
if(ereg("^<an>",$Ligne)){
echo "(";
echo $Ligne;
echo ")";
}
}
}
?>
en revanche j'ai besoin de faire une autre
chose , en effet, quand je passe de <au>
à <ti>, le signe entre les deux doit changer.
Or dans ce que j'ai fait,cela met a chaque
fois un signe en trop. Il faudrait que je fasse
un truc du genre while(a la ligne d'après il y
a <au> echo "-") et quand cela change alors on
echo autre chose ou alors je ferai un autre
echo dans le if suivant(if <ti>)..
exemple avec ce code a un moment je me retrouve
avec un ;( alors que je ne veux pas du dernier ;
j'espere etre assez clair..
merci de votre aide...
Excuse moi de ne pas t'avoir répondu hier soir mais fiesta oblige je suis pas rentré chez moi de la soirée XD mais je vois que tu t'es très bien démerdé sans moi
Pour ton problème, j'avoue ne pas comprendre très bien ton problème. Encore une fois un exemple vaut mieux qu'un long discours : tu ne veux pas me mettre ce que tu obtiens et ce que tu voudrais obtenir stp (et là je répondrais vite, je n'ai rien de prévu ce WE)
Pour ton problème, j'avoue ne pas comprendre très bien ton problème. Encore une fois un exemple vaut mieux qu'un long discours : tu ne veux pas me mettre ce que tu obtiens et ce que tu voudrais obtenir stp (et là je répondrais vite, je n'ai rien de prévu ce WE)
Maintenant j'ai un autre point important.
en gros il faudrait qu'il y un prog qui fasse :
rentrer votre fichier .txt : xxxx.txt
et la il faudrait que le prog prenne le .txt
et fasse la "traduction" comme vu precedemment
en gros il faudrait qu'il y un prog qui fasse :
rentrer votre fichier .txt : xxxx.txt
et la il faudrait que le prog prenne le .txt
et fasse la "traduction" comme vu precedemment
En gros, si je comprend bien, tu voudrais que ton script lise dans le fichier essai1.txt un texte de la forme <au>... etc
Et qu'il remplace ce fichier essai1.txt par un texte de la forme de ce que tu veux obtenir.
Si c'est bien cela je te conseillerais personnellement de créer un fichier essai2.txt qui stockerai tes valeurs "traduite" et sous la forme que tu souhaites obtenir.
Une fois toute la "traduction" effectué, tu lis ce fichier essai2.txt et tu réécris exactement le contenu de ce fichier dans le essai1.txt que tu auras bien évidemment vidé de son contenu auparavant. J'espère être clair...
Si ça te va, la fonction fwrite sera ton amie, mais je pense que tu la connait déjà...
Bonne continuation
Et qu'il remplace ce fichier essai1.txt par un texte de la forme de ce que tu veux obtenir.
Si c'est bien cela je te conseillerais personnellement de créer un fichier essai2.txt qui stockerai tes valeurs "traduite" et sous la forme que tu souhaites obtenir.
Une fois toute la "traduction" effectué, tu lis ce fichier essai2.txt et tu réécris exactement le contenu de ce fichier dans le essai1.txt que tu auras bien évidemment vidé de son contenu auparavant. J'espère être clair...
Si ça te va, la fonction fwrite sera ton amie, mais je pense que tu la connait déjà...
Bonne continuation
Bonjour, comment faire si je veux récupérer que lolo dans un fichier texte dont la premiére ligne est : AU - lolo
J'arrive à récupérer toute la ligne mais comment faire pour récupérer simplement lolo ?
Si j'ai un fichier texte de la forme suivante :
TI - kaka
AU - lolo
Comment faire pour afficher d'abord la 2e ligne (sans parcourir le fichier par la fin)
J'arrive à récupérer toute la ligne mais comment faire pour récupérer simplement lolo ?
Si j'ai un fichier texte de la forme suivante :
TI - kaka
AU - lolo
Comment faire pour afficher d'abord la 2e ligne (sans parcourir le fichier par la fin)
Pour récupérer lolo (ça fait drôle dit comme ça...) tu peux utiliser la fonction explode() par exemple.
Un exemple :
Sinon pour afficher d'abord la 2ème ligne tu peux par exemple utiliser la fonction strstr() : elle va te retourner la chaine qui commence par la chaine que tu veux
Exemple :
Un exemple :
$auteur = "AU - lolo"; $tab = explode(" - ",$auteur);Dans ce cas là : echo $tab[2]; affichera lolo, c'est à dire ce que tu veux.
Sinon pour afficher d'abord la 2ème ligne tu peux par exemple utiliser la fonction strstr() : elle va te retourner la chaine qui commence par la chaine que tu veux
Exemple :
$txt = "TI - kaka \r\n AU - lolo"; print( strstr($txt,"AU")); //Ca devrait t'afficher : AU - lolo
ok pour afficher le 3eme terme de la ligne mais comment faire pour afficher le 3éme terme jusqu'au dernier terme de la ligne
je me doute qu'il faut faire un while différent fin de ligne mais je ne connais pas la syntaxe
par contre pour afficher d'abord AU ... il n'y a pas un autre moyen??
je me doute qu'il faut faire un while différent fin de ligne mais je ne connais pas la syntaxe
par contre pour afficher d'abord AU ... il n'y a pas un autre moyen??
Excuse moi je t'avais oublié XD
En fait j'aurais voulu savoir exactement ce que tu voulais dire par "afficher le troisième terme". C'est quoi ton 3ème terme ? Tu ne pourrais pas utiliser simplement strstr() pour ça ?
et pourquoi elle ne te convainc pas ma façon d'afficher ton AU ? Parceque si tu veux que je te trouve un autre moyen de l'afficher faudrait d'abord que tu me dises pourquoi celle-ci ne va pas...
Encore une fois désolé de t'avoir oublié
En fait j'aurais voulu savoir exactement ce que tu voulais dire par "afficher le troisième terme". C'est quoi ton 3ème terme ? Tu ne pourrais pas utiliser simplement strstr() pour ça ?
et pourquoi elle ne te convainc pas ma façon d'afficher ton AU ? Parceque si tu veux que je te trouve un autre moyen de l'afficher faudrait d'abord que tu me dises pourquoi celle-ci ne va pas...
Encore une fois désolé de t'avoir oublié
ben en fait je ne veux pas afficher que le 3éme terme je veux afficher toute la ligne a parrtir du 3eme terme donc il faudrait un truc qui affiche tant que la ligne n'est pas finie....
pour ta méthode du strstr je sais pas si c'est possible en fait mon .txt commence toujours par :
TI - titre
AU - les auteurs
AU - les auteurs...
et je dois toujours afficher d'abord les auteurs et ensuite le titre sachant qu'a chaque fois il n'y a que un TI - mais qu'il peut y avoir plusieurs AU - mais ce n'est pas toujours le meme nombre donc je dois gerer ca
pour ta méthode du strstr je sais pas si c'est possible en fait mon .txt commence toujours par :
TI - titre
AU - les auteurs
AU - les auteurs...
et je dois toujours afficher d'abord les auteurs et ensuite le titre sachant qu'a chaque fois il n'y a que un TI - mais qu'il peut y avoir plusieurs AU - mais ce n'est pas toujours le meme nombre donc je dois gerer ca
dans ce cas là je pense que tu pourrais utiliser la fonction split comme ça :
Ensuite tu testes : if($tab[n] =="AU"){echo $tab[n+1];} par exemple et tu fais une boucle comme ça...
Et j'avoue que si ça ne te va pas je commence à être à court de solution...
$contenuFichier = file_get_contents("ton_fichier.txt"); $tab = split( "[-'\r\n']","$contenuFichier");Dans ton tableau $tab tu va obtenir 0->AU, 1->"nom de l'auteur", etc
Ensuite tu testes : if($tab[n] =="AU"){echo $tab[n+1];} par exemple et tu fais une boucle comme ça...
Et j'avoue que si ça ne te va pas je commence à être à court de solution...
pouras tu me montrer un peu plus précisement comment faire stp
merci d'avance