[R]StringBetween dans une boucle

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 158
Enregistré le : lun. 13 août 2007 16:38
Localisation : Yvelines
Contact :
Status : Hors ligne

[R]StringBetween dans une boucle

#1

Message par corrs78 » mar. 12 nov. 2019 17:50

Bonjour,

je ne parviens pas à affiche des chaines spécifiques trouvées dans un fichier dans une Msgbox.
Précisément j'ai un fichier qui contient quelques lignes, dans chaque ligne je veux extraire une chaine de caractère qui se trouve entre "-"et",".
La finalité est d’afficher dans une Msgbox les chaines trouvées.

Mais je n'arrive déjà pas à afficher le contenu du tableau généré par la fonction _StringBetween.
Je suppose que cette fonction dans une boucle , rend les choses un peu plus complexe, et c'est là que je suis un peu perdu.

Code : Tout sélectionner

#include <Array.au3>
#include <File.au3>
#include <String.au3>

$j = _FileCountLines("c:\mon_fichier.txt")
Local $aArray[5]
		For $i = 1 To $j
			Local $chaine = FileReadLine("c:\mon_fichier.txt",$i)
			$aArray = _StringBetween($chaine, "-", ",")
		Next
	_ArrayDisplay($aArray,"")
Merci de votre aide.
Modifié en dernier par corrs78 le ven. 15 nov. 2019 21:36, modifié 1 fois.

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11446
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#2

Message par Tlem » mar. 12 nov. 2019 18:58

Bonsoir.
Le plus simple serait très certainement de lire le fichier directement dans un tableau et ensuite de lire le tableau ligne par ligne tout en utilisant une RegEx directement sur chaque ligne pour afficher ce que vous avez entre le "- et la", "...

Pour la mise en tableau du fichier : https://www.autoitscript.fr/autoit3/doc ... oArray.htm

Pour l'expression régulière : https://www.autoitscript.fr/autoit3/doc ... RegExp.htm
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 158
Enregistré le : lun. 13 août 2007 16:38
Localisation : Yvelines
Contact :
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#3

Message par corrs78 » mar. 12 nov. 2019 21:31

Merci m'sieur Tlem, je tente cette approche dès demain.

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5886
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#4

Message par mikell » mer. 13 nov. 2019 13:56

Même si mon coeur penche pour le regex, a priori :
- FileRead le fichier dans 1 string $txt
- _StringBetween sur $txt devrait retourner un tableau avec tous les matches dedans
Et pas de boucle, c'est quand même plus simple :wink:
#include <Array.au3>
#include <String.au3>

$txt = FileRead("c:\mon_fichier.txt")
$aArray = _StringBetween($txt, "-", ",")
_ArrayDisplay($aArray)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11446
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#5

Message par Tlem » jeu. 14 nov. 2019 00:19

mikell a écrit : Même si mon coeur penche pour le regex
Et bien pourquoi n'a tu pas remplacer _StringBetween() par StringRegExp() ?
Ça optimiserait encore le code en évitant l'include String.au3 qui fait en interne appel à ... de la RegEx. ^^
En plus, si corrs78 rajoute des contraintes sur la récupérations de données, se sera certainement plus simple. ^^ ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5886
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#6

Message par mikell » jeu. 14 nov. 2019 08:58

Et bien pourquoi n'a tu pas remplacer _StringBetween() par StringRegExp() ?
Pour rester dans le sujet. Question : "StringBetween dans une boucle", réponse "pas besoin de boucle"
Et puis parce que ceux qui utilisent _StringBetween ne sont en général pas familiers avec les regex, de plus aucune autre contrainte de sélection n'est évoquée dans le post
Mais je suis bien d'accord avec toi dans le fond
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 158
Enregistré le : lun. 13 août 2007 16:38
Localisation : Yvelines
Contact :
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#7

Message par corrs78 » jeu. 14 nov. 2019 17:32

j'ai fini par opter pour _StringBetween, je n'ai pas réussi à m'en sortir avec les RegExp (comme d'habitude:/)
ensuite je suis passé par "_ArrayToString" car j'aurais préféré afficher les résultat dans une Msgbox avec un retour à la ligne à chaque fois.
J'en reviens toujours à mon problème de départ (cette fichue boucle qui me fait parcourir le tableau). j'affiche ligne par ligne dans des MsgBox distinctes, je ne parviens pas à afficher le résultat dans une même MsgBox (dans un style "liste")

voici un exemple de chaine à traiter (contenu du fichier test.txt):

"CN=AA-GROUPE-AC-XZ-0,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax"
"CN=AA-GROUPE-TEST,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax"
"CN=Ordinateurs du domaine,CN=Users,DC=ab,DC=ac,DC=ax"

Code : Tout sélectionner

Local $Txt = FileRead("c:\test.txt")
	$aArray = _StringBetween($txt, "-", ",")
	_ArrayDisplay($aArray,"résultat")
	$var = _ArrayToString($aArray)
	$result = StringSplit($var,"|")
    For $i = 1 To $result[0]
        MsgBox($MB_SYSTEMMODAL, "", "$aArray[" & $i & "] - " & $result[$i])
    Next
Modifié en dernier par corrs78 le jeu. 14 nov. 2019 17:36, modifié 1 fois.

Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 158
Enregistré le : lun. 13 août 2007 16:38
Localisation : Yvelines
Contact :
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#8

Message par corrs78 » jeu. 14 nov. 2019 17:35

mikell a écrit :
jeu. 14 nov. 2019 08:58
Et bien pourquoi n'a tu pas remplacer _StringBetween() par StringRegExp() ?
Pour rester dans le sujet. Question : "StringBetween dans une boucle", réponse "pas besoin de boucle"
en effet c'est plus simple comme ça, mais passer par un ArrayDisplay ne me plait pas (voir explications ci-dessus)

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 728
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#9

Message par walkson » jeu. 14 nov. 2019 18:11

Bonjour,
remplacer
        $result = StringSplit($var,"|")
    For $i = 1 To $result[0]
        MsgBox(0, "", "$aArray[" & $i & "] - " & $result[$i])
    Next
par
MsgBox(0,"résultat",StringReplace($var,"|",@CRLF))
Pour le regex, je me suis amusé avec ça StringRegExp($txt, "(?s)" & "-" & "(.*?)" & ",", $STR_REGEXPARRAYGLOBALMATCH)

Petite question : peut il y avoir plusieurs occurrences sur une même ligne et laquelle choisir ? (Là, j'attends la réponse du gros chat parce que ça dépasse mes connaissances)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5886
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#10

Message par mikell » jeu. 14 nov. 2019 19:01

corrs78 a écrit :
jeu. 14 nov. 2019 17:32
voici un exemple de chaine à traiter
Pour une réponse constructive, il faudrait aussi montrer le résultat souhaité...
Par exemple, je ne sais pas si ce code est correct

$txt = """CN=AA-GROUPE-AC-XZ-0,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax""" & @crlf & _
        """CN=AA-GROUPE-TEST,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax""" & @crlf & _
        """CN=Ordinateurs du domaine,CN=Users,DC=ab,DC=ac,DC=ax"""
Msgbox(0,"", $txt)

$res = StringRegExpReplace($txt, '(?m)^[^-]+-?([^,]*).*$', "$1")
Msgbox(0,"", $res)

@walkson
S'il y a plusieurs occurrences sur la même ligne, le regex tel que tu l'as écrit ramassera tout (et le _StringBetween aussi d'ailleurs)
Si on ne veut récupérer qu'une occurence par ligne il faut écrire l'expression en conséquence
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
walkson
Modérateur
Modérateur
Messages : 728
Enregistré le : ven. 12 août 2011 18:49
Localisation : Essonne
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#11

Message par walkson » jeu. 14 nov. 2019 19:30

Si on ne veut récupérer qu'une occurence par ligne il faut écrire l'expression en conséquence
C'était bien le sens de ma question :mrgreen:
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi

Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 158
Enregistré le : lun. 13 août 2007 16:38
Localisation : Yvelines
Contact :
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#12

Message par corrs78 » jeu. 14 nov. 2019 20:51

Merci pour vos bons conseils messieurs. 👍
Désolé pour l'oubli,

De mon fichier texte je dois récupérer dans chaque ligne. La première occurrence située entre AA- ... Jusqu'à la prochaine virgule. (il ne peut y en avoir qu'une "AA-" par ligne)

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5886
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#13

Message par mikell » jeu. 14 nov. 2019 21:39

walkson a écrit :
jeu. 14 nov. 2019 19:30
C'était bien le sens de ma question
Vu le flou de ladite question, qu'est-ce que je pouvais répondre d'autre ? :P
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11446
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#14

Message par Tlem » jeu. 14 nov. 2019 22:44

Finalement on va bel et bien finir avec une RegEx. :bisou:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2097
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#15

Message par jchd » ven. 15 nov. 2019 02:58

Les regex c'est la vie !
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
corrs78
Niveau 5
Niveau 5
Messages : 158
Enregistré le : lun. 13 août 2007 16:38
Localisation : Yvelines
Contact :
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#16

Message par corrs78 » ven. 15 nov. 2019 15:05

mikell a écrit :
jeu. 14 nov. 2019 19:01
corrs78 a écrit :
jeu. 14 nov. 2019 17:32
voici un exemple de chaine à traiter
Pour une réponse constructive, il faudrait aussi montrer le résultat souhaité...
Par exemple, je ne sais pas si ce code est correct

$txt = """CN=AA-GROUPE-AC-XZ-0,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax""" & @crlf & _
        """CN=AA-GROUPE-TEST,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax""" & @crlf & _
        """CN=Ordinateurs du domaine,CN=Users,DC=ab,DC=ac,DC=ax"""
Msgbox(0,"", $txt)

$res = StringRegExpReplace($txt, '(?m)^[^-]+-?([^,]*).*$', "$1")
Msgbox(0,"", $res)

@walkson
S'il y a plusieurs occurrences sur la même ligne, le regex tel que tu l'as écrit ramassera tout (et le _StringBetween aussi d'ailleurs)
Si on ne veut récupérer qu'une occurence par ligne il faut écrire l'expression en conséquence
Ca fonctionne parfaitement. J'aimerais pouvoir maitriser l'art des RegExp comme toi :shock:
je tente de déchiffrer ça. Merci

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2097
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#17

Message par jchd » ven. 15 nov. 2019 18:16

Le site regex101.com explique tout (en anglais) et permet aussi de voir la progression dans le sujet pas à pas.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

rgx
Niveau 1
Niveau 1
Messages : 9
Enregistré le : sam. 16 nov. 2019 17:53
Status : Hors ligne

Re: [R]StringBetween dans une boucle

#18

Message par rgx » sam. 16 nov. 2019 18:00

Bonjour,

Pour une RegEx qui ne ramasse qu'une seule occurrence par ligne, je propose:

AA-(.+?),

Cela fonctionne dans les éditeurs mais pas dans ce code AutoIt (?)
$txt = """CN=AA-GROUPE-AC-XZ-0,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax""" & @crlf & _
        """CN=AA-GROUPE-TEST,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax""" & @crlf & _
        """CN=Ordinateurs du domaine,CN=Users,DC=ab,DC=ac,DC=ax"""
Msgbox(0,"", $txt)

$res = StringRegExpReplace($txt, 'AA-(.+?),', "$1")
Msgbox(0,"", $res)
(Je suis nouveau ici)
:wink:

Avatar du membre
mikell
Modérateur
Modérateur
Messages : 5886
Enregistré le : dim. 29 mai 2011 16:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] StringBetween dans une boucle

#19

Message par mikell » dim. 17 nov. 2019 09:10

corrs78 a écrit :
ven. 15 nov. 2019 15:05
je tente de déchiffrer ça.
Pour info ce regex ne ramasse que la 1ère occurence rencontrée sur chaque ligne (ou rien si aucune occurence)
Si tu coinces sur la traduction des signes cabalistiques en langage compréhensible, n'hésite pas à demander :mrgreen:

@rgx
Très logiquement, ton expression fonctionne dans un StringRegExp mais pas dans un StringRegExpReplace
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )

rgx
Niveau 1
Niveau 1
Messages : 9
Enregistré le : sam. 16 nov. 2019 17:53
Status : Hors ligne

Re: [R]StringBetween dans une boucle

#20

Message par rgx » dim. 17 nov. 2019 10:48

Ah, OK, Merci :)

Une autre version, celle-ci à base de StringRegExp
Affichage console et MsgBox avec la même RegEx.
La RegEx est simple car je ne vérifie pas le nombre d’occurrence possibles sur chaque ligne (le fichier initial est supposé "bon")
$txt = """CN=AA-GROUPE-AC-XZ-0,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax""" & @crlf & _
        """CN=AA-GROUPE-TEST,OU=Groupes,OU=Administration,OU=TEST,OU=PROD,OU=TESTX,DC=ab,DC=ac,DC=ax""" & @crlf & _
        """CN=Ordinateurs du domaine,CN=Users,DC=ab,DC=ac,DC=ax"""

$res = StringRegExp($txt, 'AA-(.+?),', 3)

global $Full

For $i = 0 To UBound($res) - 1
        ConsoleWrite($res[$i] & @CRLF)
        $Full = $Full & $res[$i] & @CRLF
Next

MsgBox(0, "", $Full)

; Résultat:
; GROUPE-AC-XZ-0
; GROUPE-TEST
PS. On peut aussi utiliser
(?U)AA-(.+),
mais
AA-(.+?),
est 'compatible' tous langages

:wink:

Répondre