l'asile.fr


Question de prog

Kane
#1 Satan m'habite

Voila, j'ai une question de programmation (peu importe le langage)

J'ai un fichier (ou n'importe quel type de flux) qui est lu par bloc. Dans ce fichier je voudrais remplacer une chaine de caractère par une autre, pour cella j'utilise une fonction de remplacement qui va faire sa recherche dans chaque bloc.

Mon problème est que si la chaine que je cherche tombe au milieu de deux bloc (le début de la chaine à la fin du premier bloc et la fin de la chaine au début du second bloc) la fonction ne trouvera pas la chaine à remplacer !

Pour l'instant j'utilise de gros bloc afin de limiter la probabilité que ce problème apparaisse, mais j'ai besoin d'une solution élégante.

Le problème en php :

$fp = fopen( www.exemple.com/fichier_a_lire, 'r', false, $context);

if (!$fp) {
   echo "$errstr ($errno)<br />\n";
} else {
   while (!feof($fp)) {
      $data= fgets($fp, 10000);
      $data=str_replace("Chaine a remplacer","Chaine de remplacement",$data);
      echo $data;
   }
   fclose($fp);
}


Note : Charger tout le fichier en mémoire n'est pas une solution élégante.


Dernière modification le 07/06/07 à 16:20 par Kane
jeudi
07 juin 2007 à 16:18
 
 

Contrôler les caractères au fur et à mesure qu'ils arrivent serait plus élégant (mais il faut quand même passer par un buffer, sinon les accès disque par caractère, ça suxx)

Tu peux aussi faire un buffer avec un décalage (genre de FIFO) AZERT ZERTY ERTYU ton buffer faisant la longueur de la chaine que tu recherches.
(c'est peut-être le plus joli en fait).


jeudi
07 juin 2007 à 16:24
 
 

Kane
#3 Satan m'habite

LeChat a écrit
Contrôler les caractères au fur et à mesure qu'ils arrivent serait plus élégant (mais il faut quand même passer par un buffer, sinon les accès disque par caractère, ça suxx)

Tu peux aussi faire un buffer avec un décalage (genre de FIFO) AZERT ZERTY ERTYU ton buffer faisant la longueur de la chaine que tu recherches.
(c'est peut-être le plus joli en fait).


Heu... non, les deux solutions que tu proposent sous-entendent de lire caractère par caractère... ce qui n'est PAS performant. Du tout.


jeudi
07 juin 2007 à 16:27
 
 

Kane a écrit
LeChat a écrit
Contrôler les caractères au fur et à mesure qu'ils arrivent serait plus élégant (mais il faut quand même passer par un buffer, sinon les accès disque par caractère, ça suxx)

Tu peux aussi faire un buffer avec un décalage (genre de FIFO) AZERT ZERTY ERTYU ton buffer faisant la longueur de la chaine que tu recherches.
(c'est peut-être le plus joli en fait).


Heu... non, les deux solutions que tu proposent sous-entendent de lire caractère par caractère... ce qui n'est PAS performant. Du tout.

Je t'ai dit qu'il fallait lire par buffer avant.


Dernière modification le 07/06/07 à 16:30 par LeChat
jeudi
07 juin 2007 à 16:30
 
 

Kane
#5 Satan m'habite

hahaha, mais justement ! le problème se pose lorsque la chaine est entre deux lecture du buffer !


jeudi
07 juin 2007 à 16:33
 
 

Kane a écrit
hahaha, mais justement ! le problème se pose lorsque la chaine est entre deux lecture du buffer !

gni !

Tu lis un buffer, tu injectes le buffer dans une FIFO de la longueur de la chaine recherchée, si tu trouves, tu remplaces, tu décales la FIFO (en l'alimentant à travers le buffer de lecture, avec les données sortant de la FIFO tu alimentes un buffer servant à l'écriture (je préfère précises aussi le buffer de sortie :)

L'alimentation de la FIFO et le décalage se faisant par caractère mais via les buffers.

EDIT : Note que quand tu remplaces, tu peux décaler la FIFO de tous les caractères et non d'un seul :)


Dernière modification le 07/06/07 à 16:45 par LeChat
jeudi
07 juin 2007 à 16:35
 
 

Voilà pourquoi j'ai arrêté la prog (ça et le COBOL, et l'AS/400, et...)


jeudi
07 juin 2007 à 16:39
 
 

JiHeM a écrit
Voilà pourquoi j'ai arrêté la prog (ça et le COBOL, et l'AS/400, et...)

Pourtant c'est rigolo, on te pose un problème et tu cherches l'algo qui correspond à sa résolution.
Et vu qu'il y a une infinité de solutions, tu cherches la plus jolie.


Dernière modification le 07/06/07 à 16:46 par LeChat
jeudi
07 juin 2007 à 16:46
 
 

Ah mais la pure résolution de problèmes j'aime bien, en Prolog par exemple, c'est un des rares domaines qui me passionnait. Mais quand le problème c'est "informatise nous toute la gestion des commandes et des livraisons en 3 mois avec tel langage pourri", non merci :)


jeudi
07 juin 2007 à 17:06
 
 

Je connais rien au php. le $fp c'est ton pointeur de fichier?

Si tu le décrémentes de x(=longueur de la chaine recherchée - 1) avant de récupérer le bloc suivant, tu gardes les derniers octets du bloc précédent au début du suivant, comme ça tu risques pas de rater ta chaîne.


jeudi
07 juin 2007 à 17:06
 
 

ah ouais mais l'informatique de 1980 je dis non, l'homme est amené à s'élever et à utiliser des fonctions toutes faites pour ce genre de problèmes :)


jeudi
07 juin 2007 à 17:12
 
 

Cyp a écrit
ah ouais mais l'informatique de 1980 je dis non, l'homme est amené à s'élever et à utiliser des fonctions toutes faites pour ce genre de problèmes :)

Moi je dis : \o/ C-ANSI rulez ! \o/


jeudi
07 juin 2007 à 17:16
 
 

Moi je dis Java / C# / Ruby rulez. Mais jle dis pas trop fort parce que ca fait très geek de défendre un langage.


jeudi
07 juin 2007 à 17:19
 
 

Kane
#14 Satan m'habite

Dableuf a écrit
Je connais rien au php. le $fp c'est ton pointeur de fichier?

Si tu le décrémentes de x(=longueur de la chaine recherchée - 1) avant de récupérer le bloc suivant, tu gardes les derniers octets du bloc précédent au début du suivant, comme ça tu risques pas de rater ta chaîne.


Heuuuu ouai... putain, pourquoi je n'y ai pas pensé plus tôt!

merci !


(putain, j'ai vachement perdu en prog, a force de ne plus faire que des scripts)

ça donne :


$fp = fopen( www.exemple.com/fichier_a_lire, 'r', false, $context);

if (!$fp) {
echo "$errstr ($errno)
\n";
} else {
$end="Chaine de remplacement";
while (!feof($fp)) {
        $data= fgets($fp, 10000);
       $data=str_replace("Chaine a remplacer","Chaine de remplacement",$data);
        echo substr($data,18);
        $end= substr($data,-18);
    }
}
fclose($fp);
}



Bon, maintenant c'est moins performant... j'ai rajouté 2 fonction substr et une concaténation...


Dernière modification le 07/06/07 à 17:25 par Kane
jeudi
07 juin 2007 à 17:23
 
 

Cyp a écrit
Moi je dis Java / C# / Ruby rulez. Mais jle dis pas trop fort parce que ca fait très geek de défendre un langage.

Bah alors je dis Haskell : url : http://www.haskell.org/haskellwiki/Haskell

Là ça fait geek !


jeudi
07 juin 2007 à 17:24
 
 

Laisse ce pauvre Akshell là où il est, veux-tu.


jeudi
07 juin 2007 à 17:26
 
 

Brainfuck ou Ook!, ça c'est vraiment geek.


jeudi
07 juin 2007 à 17:38
 
 

Jihem tout le monde te cherche sur le true.


jeudi
07 juin 2007 à 17:39
 
 

JiHeM a écrit
Brainfuck ou Ook!, ça c'est vraiment geek.


Et merde t'es pas en Mongolie!


jeudi
07 juin 2007 à 17:44
 
 

Pas encore, mais c'est gentil de penser à moi.


jeudi
07 juin 2007 à 17:46
 
 

Y'a pas d'équivalent de fseek en php?


jeudi
07 juin 2007 à 17:52
 
 

JustineF
#22 3615 myliFe

Spoiler : afficher/masquer


jeudi
07 juin 2007 à 18:15
 
 

Kane a écrit

(putain, j'ai vachement perdu en prog, a force de ne plus faire que des scripts)



Hu ? Bordel, je ne programme plus non plus, je scripte la plupart du temps (Bash / awk / ... powa). Je risque la même chose ?

Enfin bon je donne tout de même des cours de C à mes étudiant(e)s j'ai toujours des bases fraîches.

Tiens d'ailleurs ton problème pourra devenir un bon sujet d'exercice.


jeudi
07 juin 2007 à 18:33
 
 

Kane
#24 Satan m'habite

Dableuf a écrit
Y'a pas d'équivalent de fseek en php?


fseek ne peut pas être utilisé sur les pointeurs retournés par fopen s'ils sont au format HTTP ou FTP.

Et j'ouvre un flux HTTP.


jeudi
07 juin 2007 à 18:35
 
 

Sinon, le Perl ça roxx pas mal aussi (c'est du compilé à l'exécution). Il y a dans ce langage des fonctionnalités d'une puissance assez sympathique.
(genre des tables de hachage et des chargements de données dans des tableaux...)


Dernière modification le 07/06/07 à 18:38 par LeChat
jeudi
07 juin 2007 à 18:36
 
 

Kane
#26 Satan m'habite


Dernière modification le 07/06/07 à 18:41 par Kane
jeudi
07 juin 2007 à 18:40
 
 

Kane a écrit
Dableuf a écrit
Y'a pas d'équivalent de fseek en php?


fseek ne peut pas être utilisé sur les pointeurs retournés par fopen s'ils sont au format HTTP ou FTP.

Et j'ouvre un flux HTTP.


Le net c'est caca...


vendredi
08 juin 2007 à 09:03
 
 

JiHeM a écrit
Ah mais la pure résolution de problèmes j'aime bien, en Prolog par exemple

Tu plaisantes hein ? Je peux pas penser qu'un être humain est capable d'aimer la programmation logique.
C'est sympa pour des petits problèmes ridicules mais dès qu'on s'attaque à quelque chose de plus conséquent c'est à se tirer des balles quand même.


vendredi
08 juin 2007 à 15:37
 
 

Non je suis sérieux :)

Après c'est sûr que j'ai fait que des petits problèmes du genre optimisation des chutes de bois dans une scierie ou du trajet d'un voyageur de commerce ou encore le classique zèbre, jamais codé un vrai système expert décisionnel.


vendredi
08 juin 2007 à 16:01
 
 

Kane
#30 Satan m'habite

JiHeM a écrit
Non je suis sérieux :)

Après c'est sûr que j'ai fait que des petits problèmes du genre optimisation des chutes de bois dans une scierie ou du trajet d'un voyageur de commerce ou encore le classique zèbre, jamais codé un vrai système expert décisionnel.

Si tu es vraiment masochiste, essaye le LISP.


vendredi
08 juin 2007 à 16:03
 
 


Répondre au sujet

Vous devez être identifié pour participer à ce topic.