[Re] Comportement de la fonction StringStripWS avec @CR

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Jeep
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 24 janv. 2019 16:34
Localisation : Belgique
Status : Hors ligne

[Re] Comportement de la fonction StringStripWS avec @CR

#1

Message par Jeep »

Bonjour,

J'essaye d'utiliser sans succès la fonction StringStripWS.
Objectif : nettoyer les blancs (espaces) et caractères de contrôle dans un texte. Voici le code utilisé:

Code : Tout sélectionner

#include <String.au3>
#include <StringConstants.au3>

Local $sText = @TAB	& "This    is   a  new story." & @CR & @LF & "Once upon a time ...  "
Local $sCheck = ""

$sCheck = StringStripWS($sText, BitOR($STR_STRIPLEADING, $STR_STRIPTRAILING, $STR_STRIPSPACES))
;$sCheck = StringStripWS($sText, $STR_STRIPLEADING + $STR_STRIPTRAILING + $STR_STRIPSPACES)

ConsoleWrite($sCheck & @CRLF)
For $i = 1 to stringlen($sCheck)
	ConsoleWrite(stringmid($sCheck,$i,1) & "-" & Asc(stringmid($sCheck,$i,1)) & @CRLF)
next
Mais contrairement à ce que dit la documentation :
"Remarks
Whitespace includes Chr(9) thru Chr(13) which are HorizontalTab, LineFeed, VerticalTab, FormFeed, and CarriageReturn. Whitespace also includes the null string ( Chr(0) ) and the standard space ( Chr(32) ).
"

Lorsque l'on observe le résultat, le Carriage Return (Chr(13)) est toujours présent. Est-ce une limitation de la fonction ? Merci d'avance pour votre aide.

Solution proposée par Jchd

Code : Tout sélectionner

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

Local $sText = @TAB	& " This    is   a  new story." & @CR & @LF & "Once upon a time ...  "
Local $sCheck = StringStripWS(StringRegExpReplace($sText, "[[:space:]]+", " "), $STR_STRIPLEADING + $STR_STRIPTRAILING + $STR_STRIPSPACES)
ConsoleWrite(">" & $sCheck & "<" & @LF)
_ArrayDisplay(StringToASCIIArray($sCheck))
Un expression régulière est utilisée pour virer notament le @CR avant l'appel de StringStripWS.

La réponse détaillée de Mikell (ci-dessous) donne l'explication du problème rencontré ci-dessus. Il n'y pas de bug c'est un comportement normal et mon objectif de vouloir nettoyer les blancs multiple et les caractères de contrôle dans une chaîne de caractères pourra s'appuyer sur StringStripWS() mais pas uniquement. La solution de Jchd est une bonne base.

Mais avec le flag $STR_STRIPSPACES on fait deux fois le travaille, une fois au niveau de l'expression régulière et une fois au niveau de StringStripWS(). Je garde l'expression régulière (j'aime plus beaucoup StringStripWS() :?) et je propose de retenir la solution suivante:

Code : Tout sélectionner

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

Local $sText = @TAB	& " This    is   a  new story." & @CR & @LF & "Once upon a time ...  "
$sCheck = _sStrSpacesClean($sText)
ConsoleWrite(">" & $sCheck & "<" & @LF)
_ArrayDisplay(StringToASCIIArray($sCheck))
Exit

Func _sStrSpacesClean($sText)
	;&========================================================================================================================
	;& Description....: Remove special characters (@CR, @LF, @TAB, ...) multiples spaces, Leading and trailing
	;&					spaces from a text
	;& Parameter(s)...:
	;&					$sText : Text to clean
	;& Return value(s)
	;&		Function..:	Result of the process
	;&		Error(s)..:	-
	;& -
	;& Versions.......: 1.0.0
	;& -
	;& Author(s)......: Jean-Pol Dekimpe (Jeep) with thanks of Jchd
	;& Date...........: 2019/01/28
	;& Modified.......: -
	;& -
	;& Remark(s)......: -
	;&========================================================================================================================
	Return StringStripWS(StringRegExpReplace($sText, "[[:space:]]+", " "), $STR_STRIPLEADING + $STR_STRIPTRAILING)
EndFunc   ;==>_sStrSpacesClean
Modifié en dernier par Jeep le dim. 27 janv. 2019 04:33, modifié 2 fois.
Un problème complexe peut souvent se découper en problèmes simples. Mais où est la scie ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#2

Message par Tlem »

Bonsoir.
Il semble en effet qu'il y ait une erreur quelque part !
Soit la description de la fonction est erronée, soit la fonction est boguée car ce n'est qu'avec un flag à 8, que nous avons la totalité des caractères considérés comme Whitespace qui sont enlevés.

Il serait sans doute judicieux de d'abord poser la question sur le forum US en utilisant le mode interrogatif pas sur de soit et plutôt courtois tel que vous l'avez fait ici. ;)
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
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR  

#3

Message par jchd »

Voir sur le Track si ce bug a déjà été signalé.

En attendant, utiliser ceci :

Code : Tout sélectionner

Local $sText = @TAB	& " This    is   a  new story." & @CR & @LF & "Once upon a time ...  "
Local $sCheck = StringStripWS(StringRegExpReplace($sText, "[[:space:]]+", " "), $STR_STRIPLEADING + $STR_STRIPTRAILING + $STR_STRIPSPACES)
ConsoleWrite(">" & $sCheck & "<" & @LF)
_ArrayDisplay(StringToASCIIArray($sCheck))
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Jeep
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 24 janv. 2019 16:34
Localisation : Belgique
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#4

Message par Jeep »

Tlem a écrit : ven. 25 janv. 2019 23:10 Bonsoir.
Il semble en effet qu'il y ait une erreur quelque part !
Soit la description de la fonction est erronée, soit la fonction est boguée car ce n'est qu'avec un flag à 8, que nous avons la totalité des caractères considérés comme Whitespace qui sont enlevés.

Il serait sans doute judicieux de d'abord poser la question sur le forum US en utilisant le mode interrogatif pas sur de soit et plutôt courtois tel que vous l'avez fait ici. ;)
Merci Tlem pour votre réponse rapide.
Mais avant de crier au loup (Bug) , je préfère m'assurer qu'il ne s'agit pas d'une erreur de ma part comme c'est souvent le cas :mrgreen: . Comme le propose jchd, je vais aller faire un tour du coté de ".com".
Un problème complexe peut souvent se découper en problèmes simples. Mais où est la scie ?
Jeep
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 24 janv. 2019 16:34
Localisation : Belgique
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#5

Message par Jeep »

jchd a écrit : sam. 26 janv. 2019 10:46 Voir sur le Track si ce bug a déjà été signalé.

En attendant, utiliser ceci :

Code : Tout sélectionner

Local $sText = @TAB	& " This    is   a  new story." & @CR & @LF & "Once upon a time ...  "
Local $sCheck = StringStripWS(StringRegExpReplace($sText, "[[:space:]]+", " "), $STR_STRIPLEADING + $STR_STRIPTRAILING + $STR_STRIPSPACES)
ConsoleWrite(">" & $sCheck & "<" & @LF)
_ArrayDisplay(StringToASCIIArray($sCheck))
Un grand merci Jchd pour cette réponse rapide et concise, je viens d'apprendre une nouvelle fonction StringToASCIIArray(). J'ai un work arround simple et efficace. De ce pas, je vais de ce pas soumettre ma question initiale sur le site ".com". Bonne journée.
Un problème complexe peut souvent se découper en problèmes simples. Mais où est la scie ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#6

Message par Tlem »

Bonjour.
Visiblement, pas de ticket en cours sur le bug track : https://www.autoitscript.com/trac/autoi ... ingStripWS
Il y a bien eu ceci en 2013, mais rien de plus.
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
TommyDDR
Modérateur
Modérateur
Messages : 2086
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#7

Message par TommyDDR »

[Déplacement dans aide générale]
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#8

Message par jchd »

Compilation éclair de ce qui s'est dit ici et outre Atlantique : pas un bug, c'est de la rouille !

En effet j'ai un peu trop vite considéré que StringStripWS remplaçait les WS surnuméraires au milieu par un espace (0x20). En fait, quand je codais pour mon propre usage, je préférais bien souvent utiliser une regexp ou du code à ma sauce. J'avais aussi je pense une fonction pour faire ce type de "ménage" sur du texte multiline, mais qui je crois conservait la notion de § (CRLF CRLF --> CRLF).

On doit pouvoir faire tout ça en une seule regexp mais ça devient prise de chou pour pas grand chose.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#9

Message par Tlem »

Certes, mais en attendant, la documentation de la fonction semble incorrecte, ou la fonction n'a pas l'air de faire ce qu'elle devrait faire puisque les CR ne sont enlevé qu'avec le flag à 8 et du coup, tous les espaces sont supprimés. ^^

Envoyé de mon Smartphone en utilisant Tapatalk
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
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#10

Message par mikell »

la documentation de la fonction semble incorrecte, ou la fonction n'a pas l'air de faire ce qu'elle devrait faire puisque les CR ne sont enlevé qu'avec le flag à 8
Pas d'accord ! Le boulot de cette fonction n'est PAS d'enlever des @cr
C'est une fonction StringStrip*, PAS StringReplace. Elle fait le job, c'est à dire avec le flag $STR_STRIPSPACES : s'il y a plusieurs espaces consécutifs garder le premier et virer ceux qui suivent
Mais comme précisé dans la doc (paragraphe Remarks), les "whitespaces" en question ne sont pas différenciés. La fonction traite de la même façon "générique" n'importe quel espace, qu'il soit horizontal ou vertical, un peu comme le ferait un \s en regex

Dans le cas précédent, elle trouve 2 espaces, @cr + @lf, elle garde le 1er et vire le second. Normal !
Si dans le code le texte est comme ça :
$sText = @TAB & " This is a new story. " & @CR & @LF & "Once upon a time ... "
avec un espace après le point, alors la fonction garde le 1er espace à savoir le chr(32), et vire les @cr et @lf (espaces n°2 et n°3)

Donc pas de bug. Et la seule chose qu'on pourrait (à la rigueur) reprocher à la doc c'est de ne pas être plus explicite sur le fait que la fonction ne fait aucune différence entre les espaces qu'ils soient horizontaux ou verticaux, bien que AMHA elle le fasse déjà : Whitespace includes ... etc

:bisou:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Jeep
Niveau 1
Niveau 1
Messages : 14
Enregistré le : jeu. 24 janv. 2019 16:34
Localisation : Belgique
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#11

Message par Jeep »

Bonjour Mikell,

Merci pour votre réponse claire et bien détaillée. J'ai obtenu une réponse équivalente de "Chimp" sur le site ".com".
Dans le contexte qui nous intéresse, la fonction StringStripWS ne remplace pas les caractères, mais simplifie en ne gardant qu'un seul caractère de type "espace".

Les caractères @LF et @CR font partie de cette famille, pour preuve si j'inverse ces deux caractères dans mon expression de départ: il reste non pas un @CR mais un @LF dans le résultat du traitement.

Un grand merci à tous.
Un problème complexe peut souvent se découper en problèmes simples. Mais où est la scie ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comportement de la fonction StringStripWS avec @CR

#12

Message par Tlem »

mikell a écrit : dim. 27 janv. 2019 00:52Pas d'accord ! Le boulot de cette fonction n'est PAS d'enlever des @cr
Effectivement, je me suis laissé enduire d'erreur de la tête aux pieds. :lol:
La prochaine fois je lirais ce genre de message sur mon PC au lieu du Smartphone, comme ça je lirait plus facilement Doc et liens explicatifs.
Heureusement que j'avais pris des pincettes pour répondre. :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é".
Répondre