Page 1 sur 1

[Re] Comportement de la fonction StringStripWS avec @CR

Posté : ven. 25 janv. 2019 13:28
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

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

Posté : ven. 25 janv. 2019 23:10
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. ;)

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

Posté : sam. 26 janv. 2019 10:46
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))

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

Posté : sam. 26 janv. 2019 11:27
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".

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

Posté : sam. 26 janv. 2019 11:42
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.

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

Posté : sam. 26 janv. 2019 11:57
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.

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

Posté : sam. 26 janv. 2019 12:06
par TommyDDR
[Déplacement dans aide générale]

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

Posté : sam. 26 janv. 2019 16:35
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.

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

Posté : sam. 26 janv. 2019 21:09
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

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

Posté : dim. 27 janv. 2019 00:52
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:

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

Posté : dim. 27 janv. 2019 04:06
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.

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

Posté : dim. 27 janv. 2019 11:19
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: