Question Substring, split, traiter une chaine de caractere!

Plus d'informations
il y a 13 ans 1 semaine #14274 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 :cheer:

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 semaine #14280 par Arnaud Petitjean
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

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.

Plus d'informations
il y a 13 ans 1 semaine #14287 par mars
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!!

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 semaine #14296 par sebastien
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

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 semaine #14297 par Philippe
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 :whistle: ) :
exemple avec : '&lt;INCOND NAME=\&quot;CL-V5OPRGLMAMJ100_AMAMAMIF1000-V5OPRGLMAMJ100_AMAMAMDPRCAL-OK\&quot; ODATE=\&quot;ODAT\&quot; /&gt;'

^&lt; commence par \&quot;&lt;\&quot;
\w+ suivit de quelques carateres textuel \&quot;INCOND\&quot;
\s suivit d'un espace
\w+ suivit de quelques carateres textuel \&quot;NAME\&quot;
. suivit d'un caratere unique
\\&quot; suivit d'un guillemet
\w+ suivit de quelques carateres textuel \&quot;CL\&quot;
- suivit d'un tiret
\w+ suivit de quelques carateres textuel \&quot;V5OPRGLMAMJ100_AMAMAMIF1000\&quot;
- suivit d'un tiret
( la je pense que c'est le debut de ce qui est recupere
\w+ dabord quelques carateres \&quot;V5OPRGLMAMJ100_AMAMAMDPRCAL\&quot;
- suivit d'un tiret
\w+ ecore quelque caratere \&quot;OK\&quot;
) fin de la chaine a recupere

arnaud (ou autre personne) si si tu lis confirme ma bonne traduction stp B)

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 :blush: mais son format :side:

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.

Plus d'informations
il y a 13 ans 1 semaine #14303 par Arnaud Petitjean
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 :

$str -match '^&lt;INCOND NAME=\&quot;\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
Propulsé par Kunena