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
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).
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.
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
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
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
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 :)
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.
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 :)
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
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
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.
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.
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.
Satan m'habite