extraire d'un texte les chaines de caractères qui...

extraire d'un texte les chaines de caractères qui... - PHP - Programmation

Marsh Posté le 21-09-2006 à 17:00:11    

Bonjour.
 
Je recherche, quelque soit le language, mais disons de préférence en java ou en C, un programme qui extrairais toute les chaines de caractères d'un fichier texte qui commencent par xxx ou sont encadrés par xxx et yyy
ou alors supprime tout les caractères non imprimables.
J'ai plein de fichier *.dat à parser, c'est ultra illisible.
Je vous demande pas une réponse toute prête, d'habitude je me débrouille pour mes scripts, mais je me dis on sait jamais, ca doit être un problème connu.
J'ai bien tenté une recherche sur google, mais je pense que le fait de pas trouver de réponse vient du fait que j'ai pas formulé ma recherche comme il faut.
 
J'ai bien trouvé une focntion java qui parse, mais si j'ai bon souvenir la gestion des fichiers en java m'as toujours fait galérer.
 
Bref, on sait jamais, si vous aviez un tuyau ou 2  :sweat:


Message édité par tuxbleu le 21-09-2006 à 18:53:27

---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 21-09-2006 à 17:00:11   

Reply

Marsh Posté le 21-09-2006 à 17:02:20    

regarde du côté des regexp, ça semble tout désigné pour ce que tu veux faire.

Reply

Marsh Posté le 21-09-2006 à 17:13:36    

MagicBuzz a écrit :

regarde du côté des regexp, ça semble tout désigné pour ce que tu veux faire.


Ok.
Je viens de tomber sur quelques scripts php qui ont l'air simpa aussi.  :jap:


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 21-09-2006 à 17:30:59    

Pour ce genre de travail, je te propose de le faire dans un langage de script, je pense par exemple à PERL qui est spécialisé dans ce genre de traitement (ce que tu souhaites faire s'écrit en une dizaine de lignes PERL)
Je ne connais pas PHP mais, d'après ce que j'ai pu en lire, ça ne me semble pas être un mauvais choix non plus pour ce genre de tache.
 
Sinon, que ce soit en C ou en Java, pas de difficulté particulière. Les expressions régulières ne me semblent pas être un pré-requis pour ce genre de tache, qui s'écrit très simplement sans utiliser cet outil.  
Surtout en C avec les ignobles regexp POSIX (Java utilise les regexp PERL :o ). Mais bon, ici, un strstr() suffit largement à ton besoin.

Message cité 1 fois
Message édité par Elmoricq le 21-09-2006 à 17:31:37
Reply

Marsh Posté le 21-09-2006 à 17:36:09    

mouais, les substr... franchement, c'est se prendre la tête pour pas grand chose : aussi chiant à mettre en place, et infiniment plus lent

Reply

Marsh Posté le 21-09-2006 à 17:45:37    

Infiniment plus lent qu'une regexp ? [:heink]
 
Et pour le "plus chiant", je ne suis pas d'accord pour ce cas particulier où la seule tache à effectuer est justement... la recherche d'une sous-chaîne.
 
Autant utiliser les bons outils. :
 
strstr(var_chaine, "truc à chercher" )  
et  
var_chaine =~ /truc à chercher/  
 
c'est équivalent.
 
edit : évidemment, dès que la recherche devient plus complexe, l'utilisation de sous-chaînes devient archaïque


Message édité par Elmoricq le 21-09-2006 à 17:47:52
Reply

Marsh Posté le 21-09-2006 à 17:50:33    

c'est pas ça, c'est que son truc c'est un fichier dat, je suppose qu'il veut chercher beaucoup d'occurences dans ce fichier
et du coup, faire des substr, ça fait une tétrachiée d'allocations mémoires pas optimisées, alors que regexp est prévu pour ça, avec des algo infiniment plus adaptés

Reply

Marsh Posté le 21-09-2006 à 17:53:45    

J'suis en train de parler du strstr() du C, qui retourne un pointeur sur la chaîne trouvée [:mlc]

Reply

Marsh Posté le 21-09-2006 à 17:56:07    

et ta chaine, t'en fait quoi après ? ds cotillons ?
si tu dois en concaténer plusieurs, je vois pas comment tu vas faire sans recopier chaque sous-chaîne pour les mettre bout à bout
 
à moins de se lancer dans un algo pompeu (mettre tous les pointeurs bout à bout dans un array, puis mesurer la longueur totale des sous-chaîne avant d'en allouer une en mémoire et tout recopier dedans en une fois), je vois pas trop cequetu vas faire.
le regexp va te permettre de faire abstraction de tout ça, c'est quand même pas mal moi je trouve...

Message cité 1 fois
Message édité par MagicBuzz le 21-09-2006 à 17:58:40
Reply

Marsh Posté le 21-09-2006 à 18:18:46    

MagicBuzz a écrit :

et ta chaine, t'en fait quoi après ? ds cotillons ?


 

Citation :

Je recherche, quelque soit le language, mais disons de préférence en java ou en C, un programme qui extrairais toute les chaines de caractères d'un fichier texte qui commencent par xxx ou sont encadrés par xxx et yyy


 

const char *debut = strstr(chaine, "xxx" ),
           *fin = strstr(chaine, "yyy" );
 
while ( debut && fin && debut +strlen("xxx" ) < fin )
{
   /* faire joujou avec la chaine trouvee */
 
   debut = strstr(fin+strlen(fin), "xxx" );
   fin = strstr(fin+strlen(fin), "yyy" );
}


 
 
Soyons clair, je ne parle que de cas précis, où la tache à réaliser est très simple. En C, utiliser les regexp suppose d'inclure regexp.h qui est POSIX.2 (donc très portable, mais pas totalement portable), et de faire appel à des fonctions plus lourdes.
 
 
Par contre, si je faisais ça en PERL, je ne m'embêterais pas :

while ( $chaine =~ /xxx(.*?)yyy/cg )
{
   /* faire joujou avec la chaine trouvee ($1) */
}
 


 
 
Mais c'est vrai que mes messages précédents n'étaient pas très précis quant aux langages évoqués.


Message édité par Elmoricq le 21-09-2006 à 18:21:53
Reply

Marsh Posté le 21-09-2006 à 18:18:46   

Reply

Marsh Posté le 21-09-2006 à 18:51:55    

Bon, j'ai attacké en php.
 
J'ai dégrossi la situation :  
J'ai viré les caractères non imprimables et un autre caractère illisible qui me  pourrissait la lecture.
maintenant j'essai de conserver tout ce qui est entre tel expression et telle expression, mais la je lutte, ce que j'ai réussi à faire m'a fait exactement le contraire, ca m'a viré ce que je voulais garder :sweat:


Message édité par tuxbleu le 21-09-2006 à 18:52:36

---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 22-09-2006 à 09:55:07    

Hummm, je solicite votre aide
Tout ce que je souhaite conserver est entre <a href ...  </a>
Ro mais j'y arrive pas :sweat:


---------------
Mon topic de vente - Mon feed-back
Reply

Marsh Posté le 22-09-2006 à 10:02:15    

Elmoricq a écrit :

Pour ce genre de travail, je te propose de le faire dans un langage de script, je pense par exemple à PERL qui est spécialisé dans ce genre de traitement (ce que tu souhaites faire s'écrit en une dizaine de lignes PERL)
Je ne connais pas PHP mais, d'après ce que j'ai pu en lire, ça ne me semble pas être un mauvais choix non plus pour ce genre de tache.


Remarque: Les regex en PHP sont bien moins rapides qu'en perl, et plus le fichier est gros plus la différence est flagrante.
 

tuxbleu a écrit :

Hummm, je solicite votre aide
Tout ce que je souhaite conserver est entre <a href ...  </a>
Ro mais j'y arrive pas :sweat:


Montre ton code :o
mais la regex doit être un truc comme ça:

/<a href(.*?)<\/a>/


 

Reply

Marsh Posté le 22-09-2006 à 14:31:31    

La "performance" de mon code ne m'interesse pas.
Ja veux juste que ca parse.
Bon, j'ai bien avancé, j'ai juste une chaine de cractère parasitaire à faire sauter, mais ca va pas être compliqué.
Merci pour les indications.


---------------
Mon topic de vente - Mon feed-back
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed