Remplacer une chaine multiple dans un fichier - PHP - Programmation
MarshPosté le 20-11-2009 à 16:56:30
Bonjour, Voilà je voulais savoir si qq'un avait une idée qui pourrait m'aider à résoudre mon problème.
Je dispose d'un fichier .txt qui ressemble à du XML avec des balises en gros ... {AB:XXXXXXXX}{CD:YYYYYYYY}{blbablblablbalbalbalbal}{AB:XXXXX} et ainsi de suite ...
Je voudrais créér un script php qui permetrait que pour chaque chaines commencant par {AB: remplacer les 8 caractères qui suivent (donc dans l'exmple les XXXXXXXX) par 8 autres caractères, même chose avec {CD: ...
Le bout de code ci-dessous fonctionne mais ne traite qu'une seule fois la demande ... en clair il trouve l'occurence, il positionne le curseur et remplace les 8 caractères qui suivent ... par uuuuuuuu. Seulement voila dans le fichier il y a plusieurs BLOC 1 et BLOC 2 ... donc logiquement il devrait bouclé ? mais non
Si qq'un à une idée ... avec un foreach $contenu as $contenu ? ca pourrait le faire ?
Code :
$fichier = "test.txt";
//ouverture en lecture et modification
$text=fopen($fichier,'r') or die("Fichier manquant" );
vu que tu n'as aucune instruction de boucle genre for ou while, ça ne peut pas boucler.
Tu devrais faire une fonction (comme tu as deux "blocs" à trouver, tu pourras l'appeler deux fois de suite), en pseudo-code ça donnerait (j'avoue avoir la flemme de faire une syntaxe correcte ) :
function mafonction ($bloc, $stream) {
je recherche bloc dans stream à partir de la position de départ tant qu'on trouve bloc dans stream { je remplace la chaîne qui va bien dans stream en utilisant la position trouvée je fais progresser la position de départ en tenant compte du nombre de caractères ainsi remplacés je recherche bloc dans stream à partir de la nouvelle position de départ } return stream }
La dernière ligne du while servant à démarrer ta recherche à partir de la dernière occurence trouvée.
Message édité par Fred999 le 20-11-2009 à 17:39:28
$text2=fopen($fichier,'w+') or die("Fichier manquant" );
fwrite($text2,$contenu_new);
fclose($text2);
?>
Warning: strpos() expects parameter 1 to be string, array given in D:\PRIV\EasyPHP5.3.0\www\test.php on line 7 Warning: strpos() expects parameter 1 to be string, array given in D:\PRIV\EasyPHP5.3.0\www\test.php on line 7 Warning: fwrite() expects parameter 2 to be string, array given in D:\PRIV\EasyPHP5.3.0\www\test.php on line 25
Je capitule
Merci pour votre aide si vous avez une idée ... Cordialement
Message édité par Odissine le 23-11-2009 à 11:29:32
Fred999
Rabat-joie
Posté le 23-11-2009 à 10:31:13
fais un print_r($stream) ça devrait aider...
Odissine
Posté le 23-11-2009 à 11:30:20
Ok merci Fred, mais heu ... je pense que le problème est ailleurs ... l'erreur se situe dans la boucle ... mais je pige pas :s
stealth35
Posté le 23-11-2009 à 11:52:44
apres tout depen de se que t'as vraiement dans 'xxxxx' et 'yyyyy' (la j'ai mis que des lettres)
Ton mini script sur le json me renvoi le contenu exacte de mon fichier ... Ceci dit voilà en gros ce que contient un fichier réellement :
{1:F01AAAAAAAAAXXX2269001727}{2:I101YYYYYYYYXXXXN}{4:TEXTE}${1:F01AAAAAAAAAXXX2269001727}{2:I999YYYYYYYYXXXXN}{4:TEXTE}${1:F01AAAAAAAAAXXX2269001727}{2:O199YYYYYYYYXXXXN}{4:TEXTE} [...] et ainsi de suite ... En clair un fichier contenu plusieurs "message" formaté avec un bloc 1, un bloc 2 et un bloc 4 ... mon but est donc de remplacer dans le bloc 1 et 2 les AAAAAAAA et YYYYYYYY par uuuuuuuu (sachant que les AA et YY peuvent avoir des valeurs différentes à chaque fois ... - Pour le BLOC 1 les 6 premiers caractères sont toujours les mêmes (donc simple je remplace les 8 caractères suivants ... par uuuuuuuu et je laisse le reste ... - Pour le BLOC 2 j'ai }{2: qui ne change pas, les trois autres caractères peuvent varier de 001 à 999 je remplace les 8 caratères suivants et je touche pas au reste ... Pour être plus clair, les parties en rouges dans les blocs sont à remplacer par "uuuuuuuu" et seulement ce qui est en rouge ...
Merci Stealth je progresse ... par contre pourrais tu m'expliquer ce que veux dire 1 et 4 dans ta variable - $rep = '\1uuuuuuuu\4'; -
je vais y arriver merci à vous en tout cas ...
stealth35
Posté le 23-11-2009 à 15:29:40
je change l'expression pour que ca marche avec ton truc,
pour les \1 et \4 enfaite c'est les groupes
groupe 1 = {AB: groupe 2 = AB groupe 3 = XXXXXXX groupe 4 = }
Merci encore pour ton aide ... seulement voilà ... le script que tu m'as donné et replacé dans mon contexte donnerai à peut pret ca :
Code :
$text = fopen($fichier,'r') or die("Fichier manquant" );
$str = file_get_contents('test.txt');
$pat = '/(\{1:F01)(\w+)(\})/';
$rep = '\1uuuuuuuu\4';
$new = preg_replace($pat, $rep, $str);
fclose($text);
$text = fopen($fichier,'w+') or die("Fichier manquant" );
fwrite($text,$new);
fclose($text);
Malheureusement voilà le résultat ...
Avant : {1:F01AAAAAAAAXXX2269001727}{2:I101YYYYYYYYXXXXN}{4: Après : {1:F01uuuuuuuu{2:I101YYYYYYYYXXXXN}{4: ...
Il m'a remplacé tout ce qu'il y avait apres les AAAAAAAA chiffres et accolades compris ... du coup quand je veux repasser ce script pour le bloc 2 ca fonctionne pas car je prend comme caractères : - }{2: -
Je pensais pas que ca allait etre si complexe ... Je pensais simplifier les choses en mettant A et Y ...
En vérité le contenu ressemble plutot à ca :
{1:F01ABCDEFGHXXX2269001727}{2:I101IJKLMNOPXXXXN}{4:TEXTE}${1:F01ABCDEFGHXXX2269001727}{2:I999QQRSTUVWXXXXN}{4:TEXTE}${1:F01ABCDEFGHXXX2269001727}{2:O199KBFGRHUKXXXXN}{4:TEXTE} ... Donc malheureusement ton script de prend les 8 caractères A ou Y ... marche po ...
Je suis sincèrement désolé en tout cas merci encore pour ton aidre !
Tu comprends mieux peut etre maintenant pourquoi je veux le remplacer par uuuuuuuu ... je veux uniformiser les informantions si c'était déjà A et Y ... je demanerais pas ca
J'y suis presque en fait a chaque fin de ligne il y aun carriage return \n que je voudrais conserver ... et l'idée est donc de vouloir remplacer les 1 à 3 lignes du champs 5K par des 111 et des ééé
Marsh Posté le 20-11-2009 à 16:56:30
Bonjour,
Voilà je voulais savoir si qq'un avait une idée qui pourrait m'aider à résoudre mon problème.
Je dispose d'un fichier .txt qui ressemble à du XML avec des balises en gros ...
{AB:XXXXXXXX}{CD:YYYYYYYY}{blbablblablbalbalbalbal}{AB:XXXXX} et ainsi de suite ...
Je voudrais créér un script php qui permetrait que pour chaque chaines commencant par {AB: remplacer les 8 caractères qui suivent (donc dans l'exmple les XXXXXXXX) par 8 autres caractères, même chose avec {CD: ...
Le bout de code ci-dessous fonctionne mais ne traite qu'une seule fois la demande ... en clair il trouve l'occurence, il positionne le curseur et remplace les 8 caractères qui suivent ... par uuuuuuuu. Seulement voila dans le fichier il y a plusieurs BLOC 1 et BLOC 2 ... donc logiquement il devrait bouclé ? mais non
Si qq'un à une idée ... avec un foreach $contenu as $contenu ? ca pourrait le faire ?
Marsh Posté le 20-11-2009 à 16:56:30
Marsh Posté le 20-11-2009 à 17:14:55
on dirait du json, s'en est a la base ?
Message édité par stealth35 le 20-11-2009 à 17:25:34
Marsh Posté le 20-11-2009 à 17:38:44
vu que tu n'as aucune instruction de boucle genre for ou while, ça ne peut pas boucler.
Tu devrais faire une fonction (comme tu as deux "blocs" à trouver, tu pourras l'appeler deux fois de suite), en pseudo-code ça donnerait (j'avoue avoir la flemme de faire une syntaxe correcte ) :
function mafonction ($bloc, $stream) {
je recherche bloc dans stream à partir de la position de départ
tant qu'on trouve bloc dans stream {
je remplace la chaîne qui va bien dans stream en utilisant la position trouvée
je fais progresser la position de départ en tenant compte du nombre de caractères ainsi remplacés
je recherche bloc dans stream à partir de la nouvelle position de départ
}
return stream
}
La dernière ligne du while servant à démarrer ta recherche à partir de la dernière occurence trouvée.
Message édité par Fred999 le 20-11-2009 à 17:39:28
Marsh Posté le 20-11-2009 à 18:25:22
un coup de regexp et le tour est joué de toute facon
Marsh Posté le 23-11-2009 à 10:29:41
Merci pour votre aide
On se moque pas je débute ... mais voilà une ébauche de ce que j'aimerais donc faire ... sauf que ca me met des erreurs
Warning: strpos() expects parameter 1 to be string, array given in D:\PRIV\EasyPHP5.3.0\www\test.php on line 7
Warning: strpos() expects parameter 1 to be string, array given in D:\PRIV\EasyPHP5.3.0\www\test.php on line 7
Warning: fwrite() expects parameter 2 to be string, array given in D:\PRIV\EasyPHP5.3.0\www\test.php on line 25
Je capitule
Merci pour votre aide si vous avez une idée ...
Cordialement
Message édité par Odissine le 23-11-2009 à 11:29:32