|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : septembre 2003 Messages : 20 ![]() |
Bonjour,
Je reçois par mail des pièces jointes au format texte. Elles consistent en une chaine de caractères et sont de longueur variable de 700/800 caractères pour les petites et jusqu'à 500 000/600 000 caractères ou plus. Reviennent de façon aléatoire des marqueurs/séparateurs de sous-chaines sur 4 caractères au sein de la chaine. Pour l'instant j'ai une boucle for qui parcourt la chaine et récupère la position du marqueur courant. Je procède ensuite à une extraction du début de la chaine jusqu'au marqueur et vais chercher le marqueur suivant, ceci jusqu'à traitement de l'ensemble des caractères de la chaine. Cette méthode nécessite 19secondes pour traiter env. 2600 caractères.Bref, c'est lent ! Quelqu'un aurait-il une idée pour réaliser cette opération ? Synthétiquement on pourrait représenter la chaine ainsi xxxxxxxxxxxxMMMMxxxxxxxxxxxxxxxxxxxxxxxxxxxxMMMMxxxxxxxxxx avec x les caractères quelconques et MMMM le marqueur. J'ai fait quelques essais avec sed mais en fait je ne veux pas chercher/remplacer mais récuperer la position de chaque 1er caractère du marqueur. Merci |
|
|
01
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
Peut être qu'en connaissant la finalité du traitement effectué sur chaque chaîne, nous serait-il possible de t'aider au mieux en te proposant l'outil (ou les outils) le(s) plus approprié(s) à ta demande. A priori, je ne pense pas que déterminer la position d'un motif afin d'en extraire la chaine précédente, ou suivante, pour un éventuel traitement et remettre ça dans la foulée avec la chaîne suivante et ainsi de suite jusqu'à la fin de la ligne, soit le plus adéquat... Mais bon, peut être que je me trompe
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
20
|
|
|
#3 |
|
Invité régulier
![]() Inscription : septembre 2003 Messages : 20 ![]() |
En fait la chaine reçue représente des fichiers texte mis bout à bout.
La fin d'un fichier "logique" est marquée par le séparateur. Le traitement consiste à repérer le séparateur pour extraire de la chaine (entre pos 0 et pos séparateur) une sous chaine enregistrée sur le disque. Le fichier logique devient ainsi un fichier physique disponible pour traitement ultérieur. Ceci explique également pourquoi le marqueur n'est pas à position fixe et pourquoi la chaine a une longueur variable. J'espère que c'est plus clair ... |
|
|
10
|
|
|
#4 | ||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
En espérant avoir tout compris et en reprenant ton exemple, un traitement à base de "sed" me semble tout approprié :
Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||
|
|
20
|
|
|
#5 |
|
Invité régulier
![]() Inscription : septembre 2003 Messages : 20 ![]() |
Merci pour la suggestion
Mais oui mais non pour la mise en oeuvre. Il faut que je garde le marqueur de fin et pas que je le remplace car ce marqueur de fin est le dernier enregistrement du fichier "logique". C'est pourquoi je n'avais pas opté pour sed. Il ne me renvoie pas de position pour une coupure efficace. (il me faut la position) C'est également la raison qui m'a poussée à parcourir la chaine. Mais en bash ça va pas vite... Evidement avec sed ou peut etre awk ca permettrait d'accélerer notablement le code. |
|
|
10
|
|
|
#6 | ||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
À partir de ton exemple plus haut, dis-nous exactement ce que tu veux obtenir en sortie...
Sinon : Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||
|
|
10
|
|
|
#7 |
|
Invité régulier
![]() Inscription : septembre 2003 Messages : 20 ![]() |
Merci pour ces diverses suggestions.
Je vais procéder de la façon suivante : - recherche avec sed et remplace MMMM avec MMMM&\n - lecture de la taille de la chaine qui se termine par MMMM&\n = obtention de la position recherchée |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com