[R] Supprimer les caractères spéciaux d'une chaine

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
A2Energie
Niveau 5
Niveau 5
Messages : 143
Enregistré le : ven. 15 nov. 2013 20:22
Status : Hors ligne

[R] Supprimer les caractères spéciaux d'une chaine

#1

Message par A2Energie »

Bonjour amis autoitiens :)

J'ai un problème que je ne parviens pas à résoudre. :D
Etat des lieux :
- J'ai des chaines (commentaires) divers et variés que je dois enregistrer dans un fichier .ini
- J'ai un nombre extrêmement important de commentaires, donc l'opération ne doit pas prendre trop de temps.

Le problème :
- Certains caractères très spéciaux (chrW()) ne sont pas compatibles avec les fichiers ini (je pense), ils sont donc enregistrés sous la forme : ?
Et j'aimerais enlever ce problème, remplacer l'ensemble des caractères problématiques par rien ""
- Je ne peux pas utiliser des stringreplace() car le nombre de caractère Unicode est extrêmement important (un truc comme de 200000)

Un exemple (c'est plus simple) :

Code : Tout sélectionner

#Include <File.au3>
$LienIni = @DesktopDir & "/TestCommentaire.ini"
$Commentaire = "Ma chaine : " & chrW(65279) & " / " & chrW(64257)
; $Commentaire = StringReplace($Commentaire, chrW(65279), "")
; $Commentaire = StringReplace($Commentaire, chrW(64257), "")

_FileCreate($LienIni)
IniWrite($LienIni, "Commentaire", "Test", $Commentaire)
$Lecture = IniRead($LienIni, "Commentaire", "Test", "Pas trouvé")

If $Lecture = $Commentaire Then
   MsgBox(0, "Ah oui bravo", $Commentaire & @CRLF & $Lecture)
Else
   MsgBox(0, "Ah ba nan !!", $Commentaire & @CRLF & $Lecture)
EndIf
Remerciements :
Merci à vous pour votre aide. :cry:
Modifié en dernier par A2Energie le mer. 17 févr. 2016 17:42, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Supprimer les caractères spéciaux d'une chaine  

#2

Message par jguinch »

Si ton fichier INI est en Unicode, ça devrait marcher...
Sinon, pour ne garder que les caractères ASCII :
$Commentaire = StringRegExpReplace($commentaire, "[^[:ascii:]]", "")
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
A2Energie
Niveau 5
Niveau 5
Messages : 143
Enregistré le : ven. 15 nov. 2013 20:22
Status : Hors ligne

Re: [..] Supprimer les caractères spéciaux d'une chaine

#3

Message par A2Energie »

Raaaah merci bcp !! :D

J'en étais pas loin, c'est énervant :lol:
j'avais essayé [:ascii:] mais il me manquait une bricole.
Il faut vraiment que je m'y mette au RegExp, c'est compliqué mais ca semble très productif.

Merci encore Jguinch
Avatar du membre
A2Energie
Niveau 5
Niveau 5
Messages : 143
Enregistré le : ven. 15 nov. 2013 20:22
Status : Hors ligne

Re: [..] Supprimer les caractères spéciaux d'une chaine

#4

Message par A2Energie »

Bonjour,

Je réédite car le problème persiste.
Je pense que c'est une partie de la solution car les ? ont disparus.
Cependant le résultat est toujours incorrecte,
Ce qui est très étrange, c'est que si je supprime les espaces avec un stringreplace($commentaire, " ", "") cela fonctionne.
Malheureusement se n'est pas ce que je recherche.
Je vais creuser. En attendant ci dessous le test actualisé :

Code : Tout sélectionner

#Include <File.au3>
$LienIni = @DesktopDir & "/TestCommentaire.ini"
$Commentaire = "Ma chaine : " & chrW(65279) & " / " & chrW(64257)
$Commentaire = StringRegExpReplace($commentaire, "[^[:ascii:]]", "")

_FileCreate($LienIni)
IniWrite($LienIni, "Commentaire", "Test", $Commentaire)
$Lecture = IniRead($LienIni, "Commentaire", "Test", "Pas trouvé")

If $Lecture = $Commentaire Then
   MsgBox(0, "Ah oui bravo", $Commentaire & @CRLF & $Lecture)
Else
   MsgBox(0, "Ah ba nan !!", $Commentaire & @CRLF & $Lecture)
EndIf
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Supprimer les caractères spéciaux d'une chaine

#5

Message par jguinch »

C'est parce que IniRead considère que les espaces en fin de ligne ne font pas partie de la valeur
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
A2Energie
Niveau 5
Niveau 5
Messages : 143
Enregistré le : ven. 15 nov. 2013 20:22
Status : Hors ligne

Re: [..] Supprimer les caractères spéciaux d'une chaine

#6

Message par A2Energie »

Merci Jgunich

C'est bien ca.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Supprimer les caractères spéciaux d'une chaine

#7

Message par orax »

A2Energie a écrit :Certains caractères très spéciaux (chrW()) ne sont pas compatibles avec les fichiers ini (je pense), ils sont donc enregistrés sous la forme : ?
Les caractères Unicode sont compatibles mais l'encodage du fichier .ini doit être est en UTF-16 LE. Voir Modification de valeurs dans un fichier INI.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
A2Energie
Niveau 5
Niveau 5
Messages : 143
Enregistré le : ven. 15 nov. 2013 20:22
Status : Hors ligne

Re: [R] Supprimer les caractères spéciaux d'une chaine

#8

Message par A2Energie »

Merci Orax pour cette précision,

Cela pourra être utile pour d'autres utilsateurs.
Pour ma part, je préfère éviter de contaminer mon code avec des caractère trop complexes.

Merci encore pour vos deux solutions.
Vous êtes toujours au top. :cry:
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [R] Supprimer les caractères spéciaux d'une chaine

#9

Message par orax »

Pour ma part, je préfère éviter de contaminer mon code avec des caractère trop complexes.
Soit je comprends mal ta remarque, soit je me suis mal fait comprendre... Je n'ai jamais dit qu'il fallait mettre des caractères Unicode dans le code. On peut garder les ChrW. C'est le .ini qui doit être en UTF16 LE. Une petite remarque à ce sujet : on pourrait aussi mettre le .ini en UTF8 par exemple, mais c'est moins logique car ça impliquerait une conversion avec BinaryToString.

Un exemple (qui pourra peut-être servir à d'autres s'il ne te sert pas ^^) :
#Include <File.au3>

$LienIni = @DesktopDir & "\TestCommentaire.ini"
$Commentaire = "Ma chaine : " & ChrW(0x270C) & " / " & ChrW(0x2764)

$hIni = FileOpen($LienIni, BitOR($FO_OVERWRITE, $FO_UTF16_LE))
FileWrite($hIni, "")
FileClose($hIni)

IniWrite($LienIni, "Commentaire", "Test", $Commentaire)
$Lecture = IniRead($LienIni, "Commentaire", "Test", "Pas trouvé")

If $Lecture = $Commentaire Then
   MsgBox(0, "Ah oui bravo", $Commentaire & @CRLF & $Lecture)
Else
   MsgBox(0, "Ah ba nan !!", $Commentaire & @CRLF & $Lecture)
EndIf
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Répondre