Page 1 sur 1

[R] Chercher et lire entre balise

Posté : ven. 21 juin 2013 21:05
par Ks10
Bonsoir à tous !

Je me heurte à un petit problème.
J'aimerais pouvoir lire dans une GUI certains éléments d'un fichier texte.

J'ai le schéma de la procédure de lecture dans ma tête mais j'ai du mal à le reproduire sous Autoit.
* On ouvre le fichier texte.
* On recherche la balise de début
* On recherche la balise de fin
* On récupère ce qui y a à l'intérieur de ces balises
* On envoie ce qui y a entre ces balises dans la GUI avec un GuiCtrlSetData.

Exemple de mon fichier texte :

Code : Tout sélectionner

<mabalise> 
Bonjour,
Mon pseudo c'est KS10 et je découvre pleins de choses sur autoit :) 
</findemabalise>
Quels sont les commandes et la structure du code qui me permettrais de faire sa ?

Re: [..] Chercher et lire entre balise

Posté : ven. 21 juin 2013 21:37
par mikell

Code : Tout sélectionner

$txt = "<mabalise>" &@crlf& _ 
"Bonjour," &@crlf& _ 
"Mon pseudo c'est KS10 et je découvre pleins de choses sur autoit :)" &@crlf& _ 
"</findemabalise>"

$res = StringRegExp($txt, '(?s)<mabalise>\s*(.*?)</findemabalise>', 3)
Msgbox(0,"", $res[0])
ou alors le regex du pauvre :mrgreen:

Code : Tout sélectionner

#include <String.au3>

$txt = "<mabalise>" &@crlf& _ 
"Bonjour," &@crlf& _ 
"Mon pseudo c'est KS10 et je découvre pleins de choses sur autoit :)" &@crlf& _ 
"</findemabalise>"

$res = _StringBetween($txt, "<mabalise>", "</findemabalise>")
Msgbox(0,"", $res[0])

Re: [..] Chercher et lire entre balise

Posté : ven. 21 juin 2013 22:10
par Ks10
mikell a écrit :

Code : Tout sélectionner

$txt = "<mabalise>" &@crlf& _ 
"Bonjour," &@crlf& _ 
"Mon pseudo c'est KS10 et je découvre pleins de choses sur autoit :)" &@crlf& _ 
"</findemabalise>"

$res = StringRegExp($txt, '(?s)<mabalise>\s*(.*?)</findemabalise>', 3)
Msgbox(0,"", $res[0])
ou alors le regex du pauvre :mrgreen:

Code : Tout sélectionner

#include <String.au3>

$txt = "<mabalise>" &@crlf& _ 
"Bonjour," &@crlf& _ 
"Mon pseudo c'est KS10 et je découvre pleins de choses sur autoit :)" &@crlf& _ 
"</findemabalise>"

$res = _StringBetween($txt, "<mabalise>", "</findemabalise>")
Msgbox(0,"", $res[0])
Une petite question ?
On n'est obliger d'écrire ce qu'il y a dans la balise ?
On ne peut pas forcer le programme à prendre automatiquement ce qu'il y a entre ces deux balises ?

Re: [..] Chercher et lire entre balise

Posté : ven. 21 juin 2013 22:22
par mikell
C'est bien ce que fait le code ^^

Code : Tout sélectionner

$txt = "texte ... etc tralala <mabalise>là ya ce que tu veux</findemabalise> tsoin tsoin ... texte etc"
$res = StringRegExp($txt, '(?s)<mabalise>\s*(.*?)</findemabalise>', 3)
Msgbox(0,"", $res[0])

Re: [..] Chercher et lire entre balise

Posté : ven. 21 juin 2013 22:34
par Ks10
Non mais je veux dire :

On n'est bien d'accord si je ne précise pas le "la ya ce que tu veux " sa :

Code : Tout sélectionner

$txt = "texte ... etc tralala <mabalise>là ya ce que tu veux</findemabalise> tsoin tsoin ... texte etc"
Entre les balises, le programme n'est pas capable d'ouvrir le fichier texte, de détecter la balise de début et de fin et de prendre ce qui y a à l'intérieur.

Look mon code de test :

Code : Tout sélectionner

#include <String.au3>


$file = FileOpen(@ScriptDir & "balise.txt")
FileRead($file)

$texte = "<testing>" &@CRLF& _
"</testing>"

$res = _StringBetween($texte, "<testing>", "</testing>")
MsgBox(64, "Informations", $res[0])

J'ai rien mit entre les balises la et lorsque je l'execute bah il y a rien dans ma msgbox.
Ton code fonctionne pour du contenue fixe mais moi je ne pourrait pas prédire ce qui apparaitra entre les balises en faite,
c'est pour sa que je veux qu'il recherche les balises dans le fichier texte et qu'il prend ce qui y a entre ^^

Re: [..] Chercher et lire entre balise

Posté : sam. 22 juin 2013 00:35
par timmalos
Le code de mikell devrait fonctionner, et le votre également. Vous devez avoir une erreur quelque part, car les 2 codes vont bien prendre le texte à l'interieur de la balise quel qu'il soit, sans qu'on le connaisse auparavant.

Il vous faut vérifier votre fichier, qu'il soit bien lu, que la variable contienne le texte récupéré, puis voir avec le code d'erreur de _StringBetween() si un autre problème n'est pas survenu

[Hors sujet]
Et je prefere clairement la solution _StringBetween, il est très très chiant de tomber sur des bouts de code en entreprise avec des RegExp qui ne font au final que des opérations très simples alors qu'elles sont compliquées en elles mêmes. Pensez aux personnes qui lisent le code derrière vous, ou même à vous même dans 1 an qui relirez ce code, le _StringBetween est clairement indiqué dans ce cas, bcp plus clair et simple, pour aucune perte de temps par rapport à la RegExp. (A cette echelle)
[/Fin Hors Sujet]

Re: [..] Chercher et lire entre balise

Posté : sam. 22 juin 2013 00:58
par jchd
[trop HS]
Encore un qui ne passerait pas ses vacances avec Jeffrey Friedl.
Pffft, tout fout le camp !
[/trop HS]

Re: [..] Chercher et lire entre balise

Posté : sam. 22 juin 2013 01:18
par timmalos
[Encore plus HS]
Au contraire ce mec est un génie ! Mais quand on a des fonctions évoluées comme _StringBetween, aucune problématique de temps de réponse alors oui je suis contre une regexp ^^
[/Encore plus HS]

Re: [..] Chercher et lire entre balise

Posté : sam. 22 juin 2013 03:07
par mikell
@Ks10
Ce code n'était fait que pour lire entre des balises, pas pour ouvrir un txt ni pour faire le café
Et le tien fonctionne, une fois corrigées les erreurs de syntaxe

Code : Tout sélectionner

#include <String.au3>

$texte = FileRead(@ScriptDir & "\balise.txt")
$res = _StringBetween($texte, "<mabalise>", "</mabalise>")
MsgBox(64, "Informations", $res[0])
@tim
Bien conscient du fait et soucieux d'éviter toute polémique, j'avais donc proposé les 2 options :roll:
[Mode orangemikell ON]
Mais puisque tu abordes le sujet, ton raisonnement revient à dire "applique cette recette, mais surtout ne cherche pas à savoir pourquoi et comment elle fonctionne" ... le genre de discours réducteur que les dirigeants politiques affectionnent
Oh oui le _StringBetween est plus facile, mais si on veut faire en plus un léger traitement de la string obtenue, faudra enchaîner une collection de fonctions StringMachin alors qu'une petite modif du regex aurait pu suffire ^^
L'OP intelligent aura (peut-être) percuté sur le res[0] et aura (peut-être) la curiosité d'aller jeter un coup d'oeil dans l'include String.au3
Toutefois, je reconnais qu'il est bon d'entretenir chez le newbie une sainte terreur du regex, ça pérennise le respect envers le clergé Image
[OFF]

Re: [..] Chercher et lire entre balise

Posté : sam. 22 juin 2013 09:22
par Ks10
NIQUEL ! ça fonctionne !
Merci & oups pour l'erreur de syntaxe x) Sa aurait du faire tilt dans ma tête mais bon...


Je suis pour les choses assez simple également.
Quand j'ai vu sa :

Code : Tout sélectionner

$res = StringRegExp($txt, '(?s)<mabalise>\s*(.*?)</findemabalise>', 3)
J'avoue que ça ma fait peur lol

Sujet résolue, merci à tous !

Re: [R] Chercher et lire entre balise

Posté : sam. 22 juin 2013 13:52
par jchd
[dernier HS]
Soit dit au passage, _StringBetween emploie trois fois ...
Autrement dit, c'est un string : un cache-sexe très fin qui ne cache pas grand'chose.
[/dernier HS]