[R] Problème pour enlever des espaces

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
eric
Niveau 5
Niveau 5
Messages : 177
Enregistré le : sam. 21 mars 2009 17:57
Localisation : Bretagne
Status : Hors ligne

[R] Problème pour enlever des espaces

#1

Message par eric »

Bonjour,

J'ai un fichier texte (du moins .log mais dedans c'est du texte) avec des données que j'aimerais exploiter.

Ce fichier étant assez long je vous en donne un extrait.

Code : Tout sélectionner

Ouverte 
    Epaisseur constante    0.0000
              aire   359162.0481
            longueur   2733.7118 

          au niveau du point  X=1077.5443  Y=1816.6292  Z=0.0000
Comme on peut le voir il y a beaucoup d'espaces dans ce texte et j'aimerais pouvoir supprimer tous les espaces à gauche du début du texte de chaque ligne, remplacer les double espaces ou plus en un simple espace et supprimer les lignes vides dans le but ensuite de placer chaque ligne dans une ligne d'array.
En gros je voudrais obtenir ceci :

Code : Tout sélectionner

Ouverte
Epaisseur constante 0.0000
aire 359162.0481
longueur 2733.7118 
au niveau du point X=1077.5443 Y=1816.6292 Z=0.0000
Je me suis dit qu'avec un StringStripWS je pourrais faire cela mais avec un réglage à 1 du StringStripWS j'obtiens ceci :

(Résultat issu de l'_arraydisplay)

Code : Tout sélectionner

6
Ouverte 
[2]|
    Epaisseur constante    0.0000
[3]|
              aire   359162.0481
[4]|
            longueur   2733.7118 


[6]|
          au niveau du point  X=1077.5443  Y=1816.6292  Z=0.0000
à 4 ceci :

Code : Tout sélectionner

3
Ouverte Epaisseur constante 0.0000
aire 359162.0481
longueur 2733.7118 au niveau du point X=1077.5443 Y=1816.6292 Z=0.0000
Et voici le code que j'ai utilisé :

Code : Tout sélectionner

#include <Array.au3>

$ouvrirtexte = FileOpen("d:\info.log",0)
$texte = fileread($ouvrirtexte)
$nettoyage = StringStripWS($texte,4)
$array = StringSplit($nettoyage,@cr)
FileClose($ouvrirtexte)
_ArrayDisplay($array)
Où est-ce que j'ai fait une erreur ou avez vous une autre solution pour obtenir le bon résultat ?

Merci

Eric
Modifié en dernier par eric le mer. 04 nov. 2015 10:28, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#2

Message par mikell »

► Afficher le texte
Cela dit pour cet exemple ton code marche aussi
Donc tu as peut-être des retours à la ligne variables(mélange de @cr et @crlf)
Dans ce cas au lieu du StringSplit on peut essayer un regex

Code : Tout sélectionner

$a = StringRegExp($res, '(?m)^.+$', 3)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#3

Message par mdanielm »

Code : Tout sélectionner

Func TwoToOne(byref $sChaine, $sCar)
    ; Remplace dans $sChaine, $sCar & $sCar par $sCar ...jusqu'à plus soif
    do
        $sChaine = StringReplace($sChaine, $sCar & $sCar, $sCar)
    until @extended=0
EndFunc
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#4

Message par orax »

StringStripWS ne supprime pas tous les types d'espace. L'espace insécable par exemple n'est pas supprimée et il y a peut-être ce type d'espaces dans le fichier.

Code : Tout sélectionner

Local Const $ESPACE_INSECABLE = Chr(0xA0)
$txt = "a" & $ESPACE_INSECABLE & "b"
$res = StringStripWS($txt, 8)
ConsoleWrite($res & @CRLF)
Autre chose, je pense avoir remarqué un comportement anormal avec StringRegExpReplace et \s. Une idée ?

Code : Tout sélectionner

Local Const $ESPACE_INSECABLE = Chr(0xA0)
$txt = "a" & $ESPACE_INSECABLE & "b"
$res = StringRegExpReplace($txt, "\s+", "") ; (MAUVAIS) $res = a b (on devrait avoir $res = ab)
ConsoleWrite($res & @CRLF)
$res = StringRegExpReplace($txt, "\h+", "") ; (BON) $res = ab
ConsoleWrite($res & @CRLF)
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#5

Message par jguinch »

Bizarre...
Sur regex101, la définition de \s est match any white space character [\r\n\t\f ]
Dans cet exemple, la première ligne contient un espace insécable, il n'est donc logiquement pas capturé.
JC, si tu passes dans le coin, t'as surement une idée ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#6

Message par orax »

Alors c'est peut-être la doc qui n'est pas bonne.
StringRegExp a écrit :Horizontal whitespace characters matched by \h
\h is equivalent to "[\x09 \xA0]" by default (or "[\x09 \xA0\x{1680}\x{180E}\x{2000}-\x{200A}\x{202F}\x{205F}\x{3000}]" when UCP is enabled.)

Whitespace characters matched by \s
\s is equivalent to "[\h\x0A\x0C\x0D]".
This set is: all characters in \h plus Linefeed (LF), Form feed (FF), Carriage return (CR).
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#7

Message par jchd »

Exact, j'ai gaffé dans la doc en faisant un racourci saisissant mais complètement faux de nos jours.

EDIT: c'est le ticket #3154

Note: je ne recommande pas l'usage de "locales" dans les regexp.

The default \s characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space (32), which are defined as white space in the "C" locale. This list may vary if locale-specific matching is taking place. For example, in some locales the "non-breaking space" character (\xA0) is recognized as white space, and in others the VT character is not.

The horizontal space characters matched by \h are:

U+0009 Horizontal tab (HT)
U+0020 Space
U+00A0 Non-break space
U+1680 Ogham space mark
U+180E Mongolian vowel separator
U+2000 En quad
U+2001 Em quad
U+2002 En space
U+2003 Em space
U+2004 Three-per-em space
U+2005 Four-per-em space
U+2006 Six-per-em space
U+2007 Figure space
U+2008 Punctuation space
U+2009 Thin space
U+200A Hair space
U+202F Narrow no-break space
U+205F Medium mathematical space
U+3000 Ideographic space

The vertical space characters matched by \v are:

U+000A Linefeed (LF)
U+000B Vertical tab (VT)
U+000C Form feed (FF)
U+000D Carriage return (CR)
U+0085 Next line (NEL)
U+2028 Line separator
U+2029 Paragraph separator
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#8

Message par mikell »

Intéressant Image
Effectivement dans ce cas ça fonctionne

Code : Tout sélectionner

Local Const $ESPACE_INSECABLE = Chr(0xA0)
$txt = "a" & $ESPACE_INSECABLE & "b"
$res = StringRegExpReplace($txt, "(*UCP)\s+", "") 
Msgbox(0,"", $res)
Edit : idem pour [:space:]
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
eric
Niveau 5
Niveau 5
Messages : 177
Enregistré le : sam. 21 mars 2009 17:57
Localisation : Bretagne
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#9

Message par eric »

Bonjour à tous,

Merci pour s'être penché sur mon problème.

Plusieurs points :

A mikell
Cela dit pour cet exemple ton code marche aussi
Oui si on met le texte directement dans le code mais cela ne fonctionne pas si je récupère ce texte depuis un fileopen et un fileread. (Du moins pas chez moi)
Essayez de coller ce texte dans le bloc note et exécutez mon code (cela ne fonctionne pas.):

Code : Tout sélectionner

Ouverte 
    Epaisseur constante    0.0000
              aire   359162.0481
            longueur   2733.7118 

          au niveau du point  X=1077.5443  Y=1816.6292  Z=0.0000
Sinon pour :

Code : Tout sélectionner

$res = StringRegExpReplace(StringRegExpReplace($txt, '(?m)^\h*\R?', "") , '\h{2,}', " ")
Ca fonctionne même depuis le fichier .log, ce qui m'embête juste c'est que je ne comprend rien aux expressions régulières. :)

Pour mdanielm

Que faut il mettre dans $scar pour obtenir le bon résultat ?

Merci
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#10

Message par mikell »

En copiant ton code dans un .txt je n'y ai pas trouvé de caractères d'espacement exotiques
Bizarre. Faudrait que tu postes directement le fichier pour qu'on y voie plus clair
ce qui m'embête juste c'est que je ne comprend rien aux expressions régulières. :)
StringRegExpReplace($txt, '(?m)^\h*\R?', "")
(?m) = mode multiligne
^ = ancre de début de ligne
\h* = 0 ou plus espaces horizontaux consécutifs
\R? = retour à la ligne, facultatif
L'expression supprime les espaces horizontaux en début de ligne (^\h*) et les lignes vides (^\h*\R)

StringRegExpReplace($txt, '\h{2,}', " ")
L'expression remplace 2 ou plus espaces horizontaux consécutifs par un espace
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
eric
Niveau 5
Niveau 5
Messages : 177
Enregistré le : sam. 21 mars 2009 17:57
Localisation : Bretagne
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#11

Message par eric »

Merci pour l'explication du StringRegExpReplace, j'ai encore du boulot là dessus :D

Sinon voici le fichier qui ne donne pas de bons résultats avec un StringStripWS
Fichiers joints
info.log
(180 Octets) Téléchargé 107 fois
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#12

Message par mikell »

J'ai compris :mrgreen:
Les lignes "ouverte" et "longueur..." contiennent un espace Chr(32) avant le @crlf, donc le StringStripWS(4) élimine les @crlf sur ces 2 lignes
Le plus simple :

Code : Tout sélectionner

$r = FileRead("info.log")
$s = StringRegExp(StringRegExpReplace($r, '\h{2,}', " "), '(?m)^\h*(\S.*)\h*$', 3)
_ArrayDisplay($s)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
eric
Niveau 5
Niveau 5
Messages : 177
Enregistré le : sam. 21 mars 2009 17:57
Localisation : Bretagne
Status : Hors ligne

Re: [..] Problème pour enlever des espaces

#13

Message par eric »

Les lignes "ouverte" et "longueur..." contiennent un espace Chr(32) avant le @crlf, donc le StringStripWS(4) élimine les @crlf sur ces 2 lignes
Ah donc ça ne venait pas seulement de moi :D
Donc le StringStripWS ne peut pas fonctionner sur ce type de fichier.
Le plus simple :

$r = FileRead("info.log")
$s = StringRegExp(StringRegExpReplace($r, '\h{2,}', " "), '(?m)^\h*(\S.*)\h*$', 3)
_ArrayDisplay($s)
Simple, simple, tout est relatif :D
Là c'est du grand art :wink:

Cela dit le $res = StringRegExpReplace(StringRegExpReplace($txt, '(?m)^\h*\R?', "") , '\h{2,}', " ") fonctionnait déjà très bien.

En tout cas merci pour tous ces bouts de code.
Répondre