Page 1 sur 1

[R] Récupérer Retours Chariots d'un edit

Posté : sam. 04 janv. 2014 10:48
par aulus
Bonjour et tous mes voeux de bonne et heureuse année 2014 à toute l'équipe du forum, en particulier à ceux ou celles qui prennent de leur temps pour dépanner les amateurs comme moi.

Je souhaite récupérer le contenu d'un Edit, y compris les retours chariot, pour impression ultérieure. Est-ce possible directement, sans enregistrer préalablement le contenu dans un fichier, puis lire ce fichier ligne par ligne ?

Je vous remercie de vos conseils.

Re: [..] récupérer Retours Chariots d'un edit

Posté : sam. 04 janv. 2014 11:25
par jguinch
Comme ça ?

Code : Tout sélectionner

$text = GUIctrlRead($myEdit)
$aText = StringRegExp($text, "(?m)^(.*)$", 3)
For $i = 0 To UBound($aText) - 1
    MsgBox(0, "", "Line " & $i + 1 & " : " & $aText[$i] )
Next

Re: [..] récupérer Retours Chariots d'un edit

Posté : sam. 04 janv. 2014 11:39
par aulus
C'est exactement ce que j'espérais... Divines expressions régulières, quand vous soumettrez-vous à ma médiocre intelligence ?

Grand merci Jguinch.

Re: [..] récupérer Retours Chariots d'un edit

Posté : sam. 04 janv. 2014 11:51
par jguinch
Libre à toi d'apprendre, c'est pas si compliqué...
En plus, il n'y avait pas forcément besoin d'un expression régulière, on aurait pu utiliser StringSplit :
$aText = StringSplit($text, chr(13))

N'oublie pas de passer ton sujet en [R]

Re: [R] Récupérer Retours Chariots d'un edit

Posté : sam. 04 janv. 2014 20:40
par jchd
Le problème avec

Code : Tout sélectionner

$aText = StringSplit($text, chr(13))
est que la scission s'effectue exclusivement sur le caractère spécifié (CR).

Du coup, si la chaîne comprend plusieurs lignes "à la Microsoft" (délimitées par CRLF), on se retrouve avec des LF en tête des chaînes intermédiaires (donc pas toutes), qui pourront perturber un traitement individuel. Certes tel n'est pas le cas ici, mais ma remarque porte sur un cas plus général.

Découper avec CRLF ne fonctionnera pas avec une chaîne utilisant CR ou LF seul.

En fait, une regexp ave \R marche dans tous les cas, du moins avec la dernière version, car ses regexps utilisent par défaut (*ANYCRLF).

Re: [R] Récupérer Retours Chariots d'un edit

Posté : dim. 05 janv. 2014 10:34
par aulus
J'ai opté pour l'expression régulière. Merci pour ces précisions qu'il est bon de connaître.

Re: [R] Récupérer Retours Chariots d'un edit

Posté : dim. 05 janv. 2014 18:07
par mikell
En effet !
Parce que si tu veux récupérer aussi les lignes vides (d'espacement entre 2 paragraphes, par exemple) il faut adapter le regex de jguinch

Code : Tout sélectionner

StringRegExp($text, '(?m)^(.+|\s+)$', 3)
ou appliquer le conseil de jchd

Code : Tout sélectionner

StringRegExp($text, '(*BSR_ANYCRLF)(.*)\R|\z', 3)

Re: [R] Récupérer Retours Chariots d'un edit

Posté : dim. 05 janv. 2014 19:09
par jchd
Oui, j'ai pris un raccourci saisissant. Je voulais dire que (*BSR_ANYCRLF) est actif par défaut maintenant, de même que (*ANYCRLF).

Re: [R] Récupérer Retours Chariots d'un edit

Posté : lun. 06 janv. 2014 08:45
par jguinch
@mikell : j'ai essayé tes propositions, mais je ne comprends pas trop le comportement :
- avec StringRegExp($text, '(?m)^(.+|\s+)$', 3), il n'y a pas tous les retours à la ligne
- avec StringRegExp($text, '(*BSR_ANYCRLF)(.*)\R|\z', 3), il n'y a pas le contenu de la dernière ligne.
Si par contre on fait StringRegExp($text, '(.*)(?:\R|\z)', 3), c'est OK mais le résultat retourne une ligne vide à la fin.

C'est peut-être du pas grand chose, mais j'aime bien essayer de comprendre (mais là...)
A+

Re: [R] Récupérer Retours Chariots d'un edit

Posté : lun. 06 janv. 2014 12:52
par mikell
Oui c'est assez tordu, le résultat dépend de ce qu'on teste et de la présence ou non d'une dernière ligne vide (ou plusieurs)
Je me suis penché là-dessus quand j'ai vu dans un post de guiness sur le forum US que Notepad++ donnait $GUI_WS_EX_PARENTDRAG à la ligne 99 dans l'include GuiConstantsEx alors que Scite le donne à la ligne 97, or je me suis fait un petit script de recherche de constante dans les includes qui doit me retourner un n° de ligne juste
J'ai donc fait les tests sur des includes
► Afficher le texte
Mais je n'ai pas testé un GuiCtrlRead d'edit

Re: [R] Récupérer Retours Chariots d'un edit

Posté : lun. 06 janv. 2014 17:35
par aulus
L'expression de Jguinch - $aText = StringRegExp($text, "(?m)^(.*)$", 3) - récupère les lignes vides.

Re: [R] Récupérer Retours Chariots d'un edit

Posté : lun. 06 janv. 2014 19:16
par mikell
Oh oui... d'ailleurs avec le test sur WindowsConstants.au3 elle en récupère même 48 en rab ^^
jguinch a écrit :avec StringRegExp($text, '(*BSR_ANYCRLF)(.*)\R|\z', 3), il n'y a pas le contenu de la dernière ligne.
Oui, quand le texte lu n'a pas de \R à la dernière ligne, c'est ça que je pige pas, \z devrait marcher
Et avec '(*BSR_ANYCRLF)(.*)\R?' on a la ligne vide en trop Image

Re: [R] Récupérer Retours Chariots d'un edit

Posté : lun. 06 janv. 2014 19:48
par aulus
mikell a écrit :Oh oui... d'ailleurs avec le test sur WindowsConstants.au3 elle en récupère même 48 en rab ^^
J'ai résolu le pb avec StringStripWS(GUICtrlRead($Edit1),3)

Re: [R] Récupérer Retours Chariots d'un edit

Posté : lun. 06 janv. 2014 20:16
par lesolutionneur
Ils me semble que les expressions régulières sont largement plus lentes que les fonctions natives comme StringSplit().
Attention pour les très long textes !

Re: [R] Récupérer Retours Chariots d'un edit

Posté : lun. 06 janv. 2014 20:29
par Tlem
@lesolutionneur
Vous devriez tester avant d'avancer certaines choses.

Chez moi, sur un fichier de 75mo, StringRegExp() met une seconde de moins que StringSplit() pour me donner le résultat ! :mrgreen:

Re: [R] Récupérer Retours Chariots d'un edit

Posté : lun. 06 janv. 2014 20:59
par mikell
@aulus
L'expression dédouble toutes les lignes vides du texte, le problème ne peut pas être résolu par un simple StringStripWS(...,3)

@lesolutionneur
Je serais curieux de savoir comment fonctionne le moteur de StringSplit...
Et il y a certainement une raison au fait que beaucoup d'UDF intégrées soient réécrites avec des regex
Exemple (puisque c'est pile dans le sujet et que je transpire dessus en ce moment) :
► Afficher le texte_FileCountLines ancienne version
► Afficher le texte_FileCountLines nouvelle version

Re: [R] Récupérer Retours Chariots d'un edit

Posté : mar. 07 janv. 2014 13:27
par lesolutionneur
C'est pour ça que j'ai utilisé "il me semble". Dans tous les langages dignes de ce nom, ça fonctionne ainsi. Alors pourquoi l'AutoIt ne respecte pas cette règle ? Pour la même raison que les autres inconvénients qui le placent derrière les autres langages.