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   -
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?
A voir également:

17 réponses

sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
Bonojur,
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
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
j'ai regardé ce code et essayé de le comprendre et aussi de faire une boucle pour tenter d'afficher ce que je veux mais je n'aboutis a rien
pouras tu me montrer un peu plus précisement comment faire stp

merci d'avance
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
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 :
$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
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
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
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
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>?
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
oui toujours dans le meme ordre
d'abord <au> puis <ti> puis <page> mais il peut y avoir plusieurs <au> on ne sait pas combien a l'avance donc ca doit gérer le probléme

merci d'avance

le .txt ne eput pas etre de la forme
<au>
<au>
<ti>
<page>

<au>
...


les <au> sont toujours avant <ti>...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
eventuellement aussi si tu ad un ou plusieurs bon tuto a me proposer ca pourrait m'interesser...
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
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é
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
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;
?>
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
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)
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
ok je te remercie
moi je peux pas repondre tout le temps trés vite car je n'ai pas toujours le net en ce moment

merci encore
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
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...
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
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)
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
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
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
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
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3 > sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention  
 
je vais regarder.
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3 > ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention  
 
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)
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
Pour récupérer lolo (ça fait drôle dit comme ça...) tu peux utiliser la fonction explode() par 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
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
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??
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
bonjour,

quelqu'un aurait une idée???
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
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é
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
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
0
ladj59 Messages postés 322 Date d'inscription   Statut Membre Dernière intervention   3
 
quelqu'un sait??
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
dans ce cas là je pense que tu pourrais utiliser la fonction split comme ça :
$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...
0