Question
Substring, split, traiter une chaine de caractere!
- mars
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 16
- Remerciements reçus 0
il y a 13 ans 1 semaine #14274
par mars
Substring, split, traiter une chaine de caractere! a été créé par mars
Serait il possible de découper une chaine de caractère pour pouvoir en tirer ce que l'on veut, sachant que ce que l'on veut se trouve toujours a la fin de la chaine de caractère et que le nombre de caractère varie tout le temps.
Exemple: voila la chaine de caractère
<INCOND NAME=\"CL-V5OPRGLMAMJ100_AMAMAMIF1000-V5OPRGLMAMJ100_AMAMAMDPRCAL-OK\" ODATE=\"ODAT\" />
et en rouge la chaine de caractère que je voudrais récupérer. Je sais que l'on peut utiliser la fonction substring mais le soucis c'est que le nombre de caractère varie sur les différentes chaines que je veux traiter. Auriez vous une idée?
sinn stocker toute ces balises dans une variable et les traiter une a une avec la méthode split...
Merci d'avance
Exemple: voila la chaine de caractère
<INCOND NAME=\"CL-V5OPRGLMAMJ100_AMAMAMIF1000-V5OPRGLMAMJ100_AMAMAMDPRCAL-OK\" ODATE=\"ODAT\" />
et en rouge la chaine de caractère que je voudrais récupérer. Je sais que l'on peut utiliser la fonction substring mais le soucis c'est que le nombre de caractère varie sur les différentes chaines que je veux traiter. Auriez vous une idée?
sinn stocker toute ces balises dans une variable et les traiter une a une avec la méthode split...
Merci d'avance
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 13 ans 1 semaine #14280
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:Substring, split, traiter une chaine de caractere!
Salut Bane,
Il y a certainement mieux comme expression régulière mais ça fonctionne...
[code:1]
PS > $str = '<INCOND NAME=\"CL-V5OPRGLMAMJ100_AMAMAMIF1000-V5OPRGLMAMJ100_AMAMAMDPRCAL-OK\" ODATE=\"ODAT\" />'
PS > $str -match '^<\w+\s\w+.\\"\w+-\w+-(\w+-\w+)'
True
PS > $matches
Name Value
----
1 V5OPRGLMAMJ100_AMAMAMDPRCAL-OK
0 <INCOND NAME=\"CL-V5OPRGLMAMJ100_AMAMAMIF1000-V5OPRGLMAMJ100_AMAMAMDPRCAL-OK
[/code:1]
Tu l'auras compris, la chaine qui t'intéresses se trouve dans $matches[1].
Arnaud
Il y a certainement mieux comme expression régulière mais ça fonctionne...
[code:1]
PS > $str = '<INCOND NAME=\"CL-V5OPRGLMAMJ100_AMAMAMIF1000-V5OPRGLMAMJ100_AMAMAMDPRCAL-OK\" ODATE=\"ODAT\" />'
PS > $str -match '^<\w+\s\w+.\\"\w+-\w+-(\w+-\w+)'
True
PS > $matches
Name Value
----
1 V5OPRGLMAMJ100_AMAMAMDPRCAL-OK
0 <INCOND NAME=\"CL-V5OPRGLMAMJ100_AMAMAMIF1000-V5OPRGLMAMJ100_AMAMAMDPRCAL-OK
[/code:1]
Tu l'auras compris, la chaine qui t'intéresses se trouve dans $matches[1].
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- mars
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 16
- Remerciements reçus 0
il y a 13 ans 1 semaine #14287
par mars
Réponse de mars sur le sujet Re:Substring, split, traiter une chaine de caractere!
merci pour ta réponse arnaud!!!
en fait mon seul soucis pour utiliser un split ou substring c'est de stocker ces balises dans une string. En fait mon fichier xml contient plusieurs balises (+1000 lignes) avec a l’intérieur plusieurs balises INCOND dont la longueur varie...
donc j'ai stocker toute les balises INCOND dans une variable mais je me rends compte que le format ne me permet pas d'utiliser la méthode split...
quand je stocke dans une variable j'ai cela comme résultat
INCOND
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMAMJ100_AMAMFSJGENAM-V5OPRGLMAMH300_V5OPRGLMAMH300-OK}
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMAPJ400_AMAPINTFAPAM-V5OPRGLMAMJ100_V5OPRGLMAMJ100-OK}
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPCGLPOFJ002_TDEBOPRGLMBO-V5OPRGLMBOS100-OK}
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPCGLPOFJ002_TDEBOPRGLMBO-V5OPRGLMBOS200-OK, CL-V5OPRGLMBOS100_V5OPRGLMBOS100-V5OPRGLM
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMGLJ150_AMGLGLPPPOST-V5OPRGLMGLA300_V5OPRGLMGLA300-OK}
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPCGLPOFJ002_TDEBOPRGLMGL-V5OPRGLMGLJ100-OK}
{CL-V5OPRGLMTRJ100_AMTRFSJGENTR-V5OPRGLMGLJ150_V5OPRGLMGLJ150, CL-V5OPRGLMBIJ999_AMBISYNCHRGL-V5OPRGLMGLJ150_V5OPRGLMGL
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMGLJ150_AMGLGLPPPOST-V5OPRGLMGLJ200_V5OPRGLMGLJ200-OK}
(bon je n'ai pas tout mis sinon ça serait trop long mais c'est un aperçu du résultat)
donc quand j'essaie de splité cette variable sa me renvoie une erreur.
J'ai essayer de faire cela :
foreach ($incond in $xml){
$incond = $string
$string.split(\"-\")[2]
}
mais cela me retourne une erreur aussi, donc c'est le format qui coince je pense
qu'en penses-tu?
merci de prendre le temps de me répondre c'est très gentil de ta part!!
en fait mon seul soucis pour utiliser un split ou substring c'est de stocker ces balises dans une string. En fait mon fichier xml contient plusieurs balises (+1000 lignes) avec a l’intérieur plusieurs balises INCOND dont la longueur varie...
donc j'ai stocker toute les balises INCOND dans une variable mais je me rends compte que le format ne me permet pas d'utiliser la méthode split...
INCOND
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMAMJ100_AMAMFSJGENAM-V5OPRGLMAMH300_V5OPRGLMAMH300-OK}
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMAPJ400_AMAPINTFAPAM-V5OPRGLMAMJ100_V5OPRGLMAMJ100-OK}
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPCGLPOFJ002_TDEBOPRGLMBO-V5OPRGLMBOS100-OK}
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPCGLPOFJ002_TDEBOPRGLMBO-V5OPRGLMBOS200-OK, CL-V5OPRGLMBOS100_V5OPRGLMBOS100-V5OPRGLM
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMGLJ150_AMGLGLPPPOST-V5OPRGLMGLA300_V5OPRGLMGLA300-OK}
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPCGLPOFJ002_TDEBOPRGLMGL-V5OPRGLMGLJ100-OK}
{CL-V5OPRGLMTRJ100_AMTRFSJGENTR-V5OPRGLMGLJ150_V5OPRGLMGLJ150, CL-V5OPRGLMBIJ999_AMBISYNCHRGL-V5OPRGLMGLJ150_V5OPRGLMGL
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMGLJ150_AMGLGLPPPOST-V5OPRGLMGLJ200_V5OPRGLMGLJ200-OK}
(bon je n'ai pas tout mis sinon ça serait trop long mais c'est un aperçu du résultat)
donc quand j'essaie de splité cette variable sa me renvoie une erreur.
J'ai essayer de faire cela :
foreach ($incond in $xml){
$incond = $string
$string.split(\"-\")[2]
}
mais cela me retourne une erreur aussi, donc c'est le format qui coince je pense
merci de prendre le temps de me répondre c'est très gentil de ta part!!
Connexion ou Créer un compte pour participer à la conversation.
- sebastien
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 32
- Remerciements reçus 0
il y a 13 ans 1 semaine #14296
par sebastien
Réponse de sebastien sur le sujet Re:Substring, split, traiter une chaine de caractere!
Bonjour,
J'ai un peu de mal a comprendre ce que fait ce bout de code :
[code:1]
bane écrit:
foreach ($incond in $xml){
$incond = $string
$string.split(\"-\"«»)[2]
}
[/code:1]
Tu changes la valeur $incond par une variable non définie.($incond = $string). voulais tu faire le code ci dessous ? :
[code:1]
foreach ($incond in $xml)
{
$string = $incond
$string.split(\"-\"«»)[2]
}
[/code:1]
Si oui, pourquoi rajouter la variable string ? Ne peux tu pas te contenter de ça :
[code:1]
foreach ($incond in $xml)
{
$incond.split(\"-\"«»)[2]
}
# Si les valeurs prises par $incond ne sont pas des strings,
# tu peux éventuellement remplacer la ligne précédente par :
foreach ($incond in $xml)
{
([string]$incond).split(\"-\"«»)[2]
}
[/code:1]
Cdt,
Seb
PS : Penses à utiliser les balises \"code\" dans tes messages, ça les rendra plus clairs
Message édité par: sebasti1, à: 14/03/13 12:59<br><br>Message édité par: sebasti1, à: 14/03/13 13:01
J'ai un peu de mal a comprendre ce que fait ce bout de code :
[code:1]
bane écrit:
foreach ($incond in $xml){
$incond = $string
$string.split(\"-\"«»)[2]
}
[/code:1]
Tu changes la valeur $incond par une variable non définie.($incond = $string). voulais tu faire le code ci dessous ? :
[code:1]
foreach ($incond in $xml)
{
$string = $incond
$string.split(\"-\"«»)[2]
}
[/code:1]
Si oui, pourquoi rajouter la variable string ? Ne peux tu pas te contenter de ça :
[code:1]
foreach ($incond in $xml)
{
$incond.split(\"-\"«»)[2]
}
# Si les valeurs prises par $incond ne sont pas des strings,
# tu peux éventuellement remplacer la ligne précédente par :
foreach ($incond in $xml)
{
([string]$incond).split(\"-\"«»)[2]
}
[/code:1]
Cdt,
Seb
PS : Penses à utiliser les balises \"code\" dans tes messages, ça les rendra plus clairs
Message édité par: sebasti1, à: 14/03/13 12:59<br><br>Message édité par: sebasti1, à: 14/03/13 13:01
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 13 ans 1 semaine #14297
par Philippe
Réponse de Philippe sur le sujet Re:Substring, split, traiter une chaine de caractere!
salut bane
avant de travailler sur le contenue,
regarde comment tu le recupere, car il me semble que les deux lignes suivante sont incomplete (tronquer a 120 car ?)
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPCGLPOFJ002_TDEBOPRGLMBO-V5OPRGLMBOS200-OK, CL-V5OPRGLMBOS100_V5OPRGLMBOS100-V5OPRGLM
{CL-V5OPRGLMTRJ100_AMTRFSJGENTR-V5OPRGLMGLJ150_V5OPRGLMGLJ150, CL-V5OPRGLMBIJ999_AMBISYNCHRGL-V5OPRGLMGLJ150_V5OPRGLMGL
en tous cas elles sont differente des autres lignes !
apres la solution de arnaud fonctionne pour le premier format de chaine que tu avait donner. la c'est plus du xml
tentative de decriptage d'un regex (j'en ai jamais fait
) :
exemple avec : '<INCOND NAME=\"CL-V5OPRGLMAMJ100_AMAMAMIF1000-V5OPRGLMAMJ100_AMAMAMDPRCAL-OK\" ODATE=\"ODAT\" />'
^< commence par \"<\"
\w+ suivit de quelques carateres textuel \"INCOND\"
\s suivit d'un espace
\w+ suivit de quelques carateres textuel \"NAME\"
. suivit d'un caratere unique
\\" suivit d'un guillemet
\w+ suivit de quelques carateres textuel \"CL\"
- suivit d'un tiret
\w+ suivit de quelques carateres textuel \"V5OPRGLMAMJ100_AMAMAMIF1000\"
- suivit d'un tiret
( la je pense que c'est le debut de ce qui est recupere
\w+ dabord quelques carateres \"V5OPRGLMAMJ100_AMAMAMDPRCAL\"
- suivit d'un tiret
\w+ ecore quelque caratere \"OK\"
) fin de la chaine a recupere
arnaud (ou autre personne) si si tu lis confirme ma bonne traduction stp
comme tu voi c'est pas la longeur de la chaine qui compte mais son format
par exemple ci-dessous tu recupere POFAUTORISE-OK mais pas V5OPRGLMAMH300_V5OPRGLMAMH300-OK
$str = '{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMAMJ100_AMAMFSJGENAM-V5OPRGLMAMH300_V5OPRGLMAMH300-OK}'
$str -match '^{\w+-\w+-(\w+-\w+)'
$matches
Name Value
----
1 POFAUTORISE-OK
0 {CL-V5OPRGL-POFAUTORISE-OK
mais ca fonctionne pas avec toutes les lignes de l'extrait donner dans ton dernier post
je me repete mais c'est pas la longeur de la chaine qui compte
mais son format 
donne nous plus d'info sur la facon dont tu lit ton fichier (les lignes de script) et aussi le veritable contenue de ton fichier xml (un extrait biensur mais avec les different cas de formatage)
a bientot pour la suite de ton script
avant de travailler sur le contenue,
regarde comment tu le recupere, car il me semble que les deux lignes suivante sont incomplete (tronquer a 120 car ?)
{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPCGLPOFJ002_TDEBOPRGLMBO-V5OPRGLMBOS200-OK, CL-V5OPRGLMBOS100_V5OPRGLMBOS100-V5OPRGLM
{CL-V5OPRGLMTRJ100_AMTRFSJGENTR-V5OPRGLMGLJ150_V5OPRGLMGLJ150, CL-V5OPRGLMBIJ999_AMBISYNCHRGL-V5OPRGLMGLJ150_V5OPRGLMGL
en tous cas elles sont differente des autres lignes !
apres la solution de arnaud fonctionne pour le premier format de chaine que tu avait donner. la c'est plus du xml
tentative de decriptage d'un regex (j'en ai jamais fait
exemple avec : '<INCOND NAME=\"CL-V5OPRGLMAMJ100_AMAMAMIF1000-V5OPRGLMAMJ100_AMAMAMDPRCAL-OK\" ODATE=\"ODAT\" />'
^< commence par \"<\"
\w+ suivit de quelques carateres textuel \"INCOND\"
\s suivit d'un espace
\w+ suivit de quelques carateres textuel \"NAME\"
. suivit d'un caratere unique
\\" suivit d'un guillemet
\w+ suivit de quelques carateres textuel \"CL\"
- suivit d'un tiret
\w+ suivit de quelques carateres textuel \"V5OPRGLMAMJ100_AMAMAMIF1000\"
- suivit d'un tiret
( la je pense que c'est le debut de ce qui est recupere
\w+ dabord quelques carateres \"V5OPRGLMAMJ100_AMAMAMDPRCAL\"
- suivit d'un tiret
\w+ ecore quelque caratere \"OK\"
) fin de la chaine a recupere
arnaud (ou autre personne) si si tu lis confirme ma bonne traduction stp
comme tu voi c'est pas la longeur de la chaine qui compte mais son format
par exemple ci-dessous tu recupere POFAUTORISE-OK mais pas V5OPRGLMAMH300_V5OPRGLMAMH300-OK
$str = '{CL-V5OPRGL-POFAUTORISE-OK, CL-V5OPRGLMAMJ100_AMAMFSJGENAM-V5OPRGLMAMH300_V5OPRGLMAMH300-OK}'
$str -match '^{\w+-\w+-(\w+-\w+)'
$matches
Name Value
----
1 POFAUTORISE-OK
0 {CL-V5OPRGL-POFAUTORISE-OK
mais ca fonctionne pas avec toutes les lignes de l'extrait donner dans ton dernier post
je me repete mais c'est pas la longeur de la chaine qui compte
donne nous plus d'info sur la facon dont tu lit ton fichier (les lignes de script) et aussi le veritable contenue de ton fichier xml (un extrait biensur mais avec les different cas de formatage)
a bientot pour la suite de ton script
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 13 ans 1 semaine #14303
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:Substring, split, traiter une chaine de caractere!
Salut !
Oui 6ratgus, tu as bien décrypté la regex.
En la revoyant je me suis dit que l'on pouvait aussi l'écrire comme cela :
A mon sens avec un split(ou plusieurs) on va jamais s'en sortir pour traiter cette problématique car comme tu le dit si bien c'est le format qui varie.
Je pense qu'un extract de fichier XML aiderait à te dépanner.
Arnaud
Oui 6ratgus, tu as bien décrypté la regex.
En la revoyant je me suis dit que l'on pouvait aussi l'écrire comme cela :
$str -match '^<INCOND NAME=\"\w+-\w+-(\w+-\w+)'
A mon sens avec un split(ou plusieurs) on va jamais s'en sortir pour traiter cette problématique car comme tu le dit si bien c'est le format qui varie.
Je pense qu'un extract de fichier XML aiderait à te dépanner.
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.053 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Substring, split, traiter une chaine de caractere!