Page 1 sur 1

[R]StringBetween dans une boucle

Posté : mar. 12 nov. 2019 17:50
par corrs78
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.

Re: [..] StringBetween dans une boucle

Posté : mar. 12 nov. 2019 18:58
par Tlem
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

Re: [..] StringBetween dans une boucle

Posté : mar. 12 nov. 2019 21:31
par corrs78
Merci m'sieur Tlem, je tente cette approche dès demain.

Re: [..] StringBetween dans une boucle

Posté : mer. 13 nov. 2019 13:56
par mikell
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)

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 00:19
par Tlem
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. ^^ ^^

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 08:58
par mikell
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

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 17:32
par corrs78
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

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 17:35
par corrs78
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)

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 18:11
par walkson
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)

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 19:01
par mikell
corrs78 a écrit : jeu. 14 nov. 2019 17:32voici 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

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 19:30
par walkson
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:

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 20:51
par corrs78
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)

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 21:39
par mikell
walkson a écrit : jeu. 14 nov. 2019 19:30C'était bien le sens de ma question
Vu le flou de ladite question, qu'est-ce que je pouvais répondre d'autre ? :P

Re: [..] StringBetween dans une boucle

Posté : jeu. 14 nov. 2019 22:44
par Tlem
Finalement on va bel et bien finir avec une RegEx. :bisou:

Re: [..] StringBetween dans une boucle

Posté : ven. 15 nov. 2019 02:58
par jchd
Les regex c'est la vie !

Re: [..] StringBetween dans une boucle

Posté : ven. 15 nov. 2019 15:05
par corrs78
mikell a écrit : jeu. 14 nov. 2019 19:01
corrs78 a écrit : jeu. 14 nov. 2019 17:32voici 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

Re: [..] StringBetween dans une boucle

Posté : ven. 15 nov. 2019 18:16
par jchd
Le site regex101.com explique tout (en anglais) et permet aussi de voir la progression dans le sujet pas à pas.

Re: [R]StringBetween dans une boucle

Posté : sam. 16 nov. 2019 18:00
par rgx
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:

Re: [..] StringBetween dans une boucle

Posté : dim. 17 nov. 2019 09:10
par mikell
corrs78 a écrit : ven. 15 nov. 2019 15:05je 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

Re: [R]StringBetween dans une boucle

Posté : dim. 17 nov. 2019 10:48
par rgx
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: