PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → Extraction de chaine
Extraction de chaine
Débuté par Kael, 25 mai 2004 22:14 - 9 réponses
Posté le 25 mai 2004 - 22:14
Bonjour ^^

J'ai un petit problème sur des découpages de chaines de caractère, je vous
donne un exemple :

ch est une chaine
ch = "fonction1(1,2,3).fonction2(1,2.3).fonction3(3.3,1).fonction4"

mon probleme c'est que les chiffres décimaux doivent être mis avec des "."
(je ne peux rien y faire pour des raisons qui n'ont pas leur place ici) mais
je dois trouver un moyen de stocker chanque fonction avec ses arguments dans
des variables. S'il n'y avait pas cette histoire de chiffres décimaux, j'aurais
utilisé un simple Extraitchaine...

Précision : le nombre de fonction dans ch n'est pas limité, je peux très
bien avoir des cas allant à 7-8 fonctions facile.

L'un de vous a une idée ?

Merci d'avance ^^
Posté le 26 mai 2004 - 11:55
Ton nombre de parametre est t'il constant?
Connias tu les nom de fonction à l'avances comme sur ton exemple? (fonction1
et fonction2....)


Mis à part ça une solution s'offre à toi un automate! Cette automate va te
permettre de faire une analyse lexicale de ta chaine.
(Recherche sur google : automate lex "anlalyse lexicale")

"Kael" <exkael@hotmail.com> a écrit dans le message de news:
40b443e1@news.pcsoft.fr...


Bonjour ^^

J'ai un petit problème sur des découpages de chaines de caractère, je vous
donne un exemple :

ch est une chaine
ch = "fonction1(1,2,3).fonction2(1,2.3).fonction3(3.3,1).fonction4"

mon probleme c'est que les chiffres décimaux doivent être mis avec des "."
(je ne peux rien y faire pour des raisons qui n'ont pas leur place ici)

mais
> je dois trouver un moyen de stocker chanque fonction avec ses arguments
dans
des variables. S'il n'y avait pas cette histoire de chiffres décimaux,

j'aurais
utilisé un simple Extraitchaine...

Précision : le nombre de fonction dans ch n'est pas limité, je peux très
bien avoir des cas allant à 7-8 fonctions facile.

L'un de vous a une idée ?

Merci d'avance ^^
Posté le 26 mai 2004 - 12:08
Il faut effectuer des recherches avec l'instruction Position(), de la chaîne
"fonction" pour délimiter le nombre de fonction dedans. Il ne faut pas effectuer
des recherches sur le séparateur "." car il est aussi utilisé pour les décimaux.

Courage.

"Kael" <exkael@hotmail.com> wrote:


Bonjour ^^

J'ai un petit problème sur des découpages de chaines de caractère, je vous
donne un exemple :

ch est une chaine
ch = "fonction1(1,2,3).fonction2(1,2.3).fonction3(3.3,1).fonction4"

mon probleme c'est que les chiffres décimaux doivent être mis avec des "."
(je ne peux rien y faire pour des raisons qui n'ont pas leur place ici)

mais
>je dois trouver un moyen de stocker chanque fonction avec ses arguments
dans
des variables. S'il n'y avait pas cette histoire de chiffres décimaux, j'aurais
utilisé un simple Extraitchaine...

Précision : le nombre de fonction dans ch n'est pas limité, je peux très
bien avoir des cas allant à 7-8 fonctions facile.

L'un de vous a une idée ?

Merci d'avance ^^
Posté le 26 mai 2004 - 12:49
"Kael" <exkael@hotmail.com> wrote:


Bonjour ^^

J'ai un petit problème sur des découpages de chaines de caractère, je vous
donne un exemple :

ch est une chaine
ch = "fonction1(1,2,3).fonction2(1,2.3).fonction3(3.3,1).fonction4"

mon probleme c'est que les chiffres décimaux doivent être mis avec des "."
(je ne peux rien y faire pour des raisons qui n'ont pas leur place ici)

mais
>je dois trouver un moyen de stocker chanque fonction avec ses arguments
dans
des variables. S'il n'y avait pas cette histoire de chiffres décimaux, j'aurais
utilisé un simple Extraitchaine...

Précision : le nombre de fonction dans ch n'est pas limité, je peux très
bien avoir des cas allant à 7-8 fonctions facile.

L'un de vous a une idée ?

Merci d'avance ^^

Bonjour,

Si toutes tes fonctions ont des arguments alors tu as pour chacune d'elles
une parenthése fermante et, dans ce cas, tu peux faire un ExtraîtChaîne(ch,<rang>,").")
par exemple.
Dans le cas contraire, recherche la position des "." grace aux fonctions
Position ou PositionOccurrence et pour chaque point trouvé, teste si le caractére
suivant est un chiffre (code ASCII de 48 à 57) ...

En espérant t'avoir aidé,
Eric
Posté le 26 mai 2004 - 14:10
Bonjour,

Juste une question stupide :
ch est une chaine
ch = "fonction1(1,2,3).fonction2(1,2.3).fonction3(3.3,1).fonction4"


Pourquoi ne pas faire ch = "fonction1(1,2,3)"+TAB+"fonction2(1,2.3)"+TAB+
....

Après un extraitchaine est facile a utiliser.

Ami Calmant
Stéphane


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.690 / Virus Database: 451 - Release Date: 22/05/2004
Posté le 26 mai 2004 - 17:16
"Eric Descatoire" <ericdescatoire@yahoo.fr> wrote:


"Kael" <exkael@hotmail.com> wrote:


Bonjour ^^

J'ai un petit problème sur des découpages de chaines de caractère, je vous
donne un exemple :

ch est une chaine
ch = "fonction1(1,2,3).fonction2(1,2.3).fonction3(3.3,1).fonction4"

mon probleme c'est que les chiffres décimaux doivent être mis avec des

"."
(je ne peux rien y faire pour des raisons qui n'ont pas leur place ici)
mais

je dois trouver un moyen de stocker chanque fonction avec ses arguments
dans

des variables. S'il n'y avait pas cette histoire de chiffres décimaux,

j'aurais
utilisé un simple Extraitchaine...

Précision : le nombre de fonction dans ch n'est pas limité, je peux très
bien avoir des cas allant à 7-8 fonctions facile.

L'un de vous a une idée ?

Merci d'avance ^^

Bonjour,


Si toutes tes fonctions ont des arguments alors tu as pour chacune d'elles
une parenthése fermante et, dans ce cas, tu peux faire un ExtraîtChaîne(ch,<rang>,").")
par exemple.
Dans le cas contraire, recherche la position des "." grace aux fonctions
Position ou PositionOccurrence et pour chaque point trouvé, teste si le

caractére
suivant est un chiffre (code ASCII de 48 à 57) ...

En espérant t'avoir aidé,
Eric

suite à mon précédent message
traîtement pour résoudre ton problème:
chExtraite est un tableau de 4 chaînes // stockage des fonctions extraites

// Ajout d'un point à la fin de la chaîne ch
ch est une chaîne = "Blop(1,2,3).flac(1,2.3).zoup.test(3.3,1)"+"."
np est un entier = 1 // rang du "." dans la chaîne ch
nf est un entier = 1 // rang de la fonction dans la chaîne ch
pos est un entier = PositionOccurrence(ch,".",np) // position du point de
rang np
TANTQUE pos <> 0
chExtraite[nf] += ExtraitChaîne(ch,np,".")
SI 47 < Asc(ch[[pos+1]]) < 58 ALORS
// cas du point décimal
chExtraite[nf] += "."
SINON
// cas du point séparateur de fonction
nf++
FIN
// rang et position du point suivant
np++
pos = PositionOccurrence(ch,".",np)
FIN
Info(chExtraite[1],chExtraite[2],chExtraite[3],chExtraite[4])

Bon dev,
Eric
Posté le 26 mai 2004 - 20:02
Merci à tous pour toutes ces réponses (et plus particulièrement à Eric qui
a trouvé une solution vraiment excellente).
Posté le 26 mai 2004 - 21:10
Bon ben je vais continuer de vous embeter sur un autre probleme ^^ (désolé
T_T)

maintenant que j'ai recupéré la n ième fonction que je veux, j'ai codé de
quoi la modifier et maintenant il faut que je la réinjecte dans la chaine
ch

sachant que je dispose de la fonction d'Eric (on doit pouvoir la réutiliser
ou la modifier), de la chaine à infecter, du numéro de la fonction a remplacer.

petit schéma :

fonction1(1,2.5,3).fonction2.fonction3(1.5).fonction4(2.5,1)
je récupère fonction3(1.5) et je sais que c'est la 3ieme fonction
je la modifie en fonction3(1.8)
il faut la remettre là ou il faut mainteant T_T

Merci d'avance .. ^^!
Posté le 27 mai 2004 - 17:16
"Kael" <exKael@hotmail.com> wrote:


Bon ben je vais continuer de vous embeter sur un autre probleme ^^ (désolé
T_T)

maintenant que j'ai recupéré la n ième fonction que je veux, j'ai codé de
quoi la modifier et maintenant il faut que je la réinjecte dans la chaine
ch

sachant que je dispose de la fonction d'Eric (on doit pouvoir la réutiliser
ou la modifier), de la chaine à infecter, du numéro de la fonction a remplacer.

petit schéma :

fonction1(1,2.5,3).fonction2.fonction3(1.5).fonction4(2.5,1)
je récupère fonction3(1.5) et je sais que c'est la 3ieme fonction
je la modifie en fonction3(1.8)
il faut la remettre là ou il faut mainteant T_T

Merci d'avance .. ^^!

Bonjour,

-Si les fonctions de ch sont toutes différentes, il suffit simplement d'utiliser
l'instruction Remplace:
ch = Remplace(ch,fonction3(1.5),fonction3(1.8))

-Dans le cas contraire, j'ai créé un pointeur de position des points qui
séparent les fonctions (posChExtraite). Ce qui donne (Lignes ajoutées suivies
de <--):
chExtraite est un tableau de 4 chaînes // stockage des fonctions extraites

posChExtraite est un tableau de 5 entiers // <--
posChExtraite[1] = 0 // <--
// Ajout d'un point à la fin de la chaîne ch
ch est une chaîne = "Blop(1,2,3).flac(1,2.3).zoup.test(3.3,1)"+"."
np est un entier = 1 // rang du "." dans la chaîne ch
nf est un entier = 1 // rang de la fonction dans la chaîne ch
pos est un entier = PositionOccurrence(ch,".",np) // position du point de
rang np
TANTQUE pos <> 0
chExtraite[nf] += ExtraitChaîne(ch,np,".")
SI 47 < Asc(ch[[pos+1]]) < 58 ALORS
// cas du point décimal
chExtraite[nf] += "."
SINON
// cas du point séparateur de fonction
nf++
posChExtraite[nf] = pos // <--
FIN
// rang et position du point suivant
np++
pos = PositionOccurrence(ch,".",np)
FIN
Info(chExtraite[1],chExtraite[2],chExtraite[3],chExtraite[4])

nfr est un entier = 3 // rang de la fonction à remplacer dans ch <--
FonctionModifiée est une chaîne = "#####" // <--
ch = ch[[A posChExtraite[nfr]]]+FonctionModifiée+ch[[posChExtraite[nfr+1]
A]] // <--
Info(ch)

Bien sur dans tous les cas, ne pas oublier d'oter le point ajouté à la chaîne
ch.

Bon dev,
Eric
Posté le 27 mai 2004 - 19:14
Merci infiniment :)