Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Suppression des espaces pour recuperer les données ?

5 réponses
Avatar
Mag
Bonjour,

débutante ;=) merci d'avance pour votre aide.


J'ai une variable qui ressemble a cela:

192.168.10.47 4 65500 2050682 257839 63672463 0 0 6w4d

elle peut etre aussi:

192.168.10.2 4 5500 2050682 257839 63672463 0 0 6w4d

en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est
pas "fixe"

comment obtenir un:
192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d
sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un
espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere
de la ligne)

Mag

5 réponses

Avatar
espie
In article <4838f596$0$31872$,
Mag wrote:
Bonjour,

débutante ;=) merci d'avance pour votre aide.


J'ai une variable qui ressemble a cela:

192.168.10.47 4 65500 2050682 257839 63672463 0 0 6w4d

elle peut etre aussi:

192.168.10.2 4 5500 2050682 257839 63672463 0 0 6w4d

en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est
pas "fixe"

comment obtenir un:
192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d
sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un
espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere
de la ligne)


1/ la regexp s+ matche au moins un espace, et le maximum possible.
2/ split permet de couper une chaine selon des regexps
3/ join permet de recoller une liste.

Il y a plusieurs facons d'enlever un eventuel espace initial.

par exemple, si tout est dans $a au depart:

@l = split /s+/, $a;
if ($l[0] eq '') {
shift @l;
}
$b = join(';', @l);

Si tu veux simplement transformer ta variable, tu peux faire la chose suivante:
$a =~ s/^s+//;
$a =~ s/s+/;/g;

Avatar
Nicolas George
Marc Espie wrote in message <g1b6o1$1rsc$:
@l = split /s+/, $a;
if ($l[0] eq '') {
shift @l;
}


La lecture de la doc de split est à conseiller quand on écrit des trucs
comme ça :

As a special case, specifying a PATTERN of space (' ') will
split on white space just as "split" with no arguments does.
Thus, "split(' ')" can be used to emulate awk's default
behavior, whereas "split(/ /)" will give you as many null
initial fields as there are leading spaces. A "split" on
"/s+/" is like a "split(' ')" except that any leading
whitespace produces a null first field. A "split" with no
arguments really does a "split(' ', $_)" internally.

Avatar
Paul Gaborit
À (at) Sun, 25 May 2008 07:13:59 +0200,
Mag écrivait (wrote):
J'ai une variable qui ressemble a cela:

192.168.10.47 4 65500 2050682 257839 63672463 0 0 6w4d

elle peut etre aussi:

192.168.10.2 4 5500 2050682 257839 63672463 0 0 6w4d

en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est
pas "fixe"

comment obtenir un:
192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d
sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un
espace qui remplace le "1" (le 9 ne se retrouve pas en premier
caractere de la ligne)


Le mieux serait de lire la doc de 'split' et de 'join'. Mais il se
trouve que 'split' avec ses réglages par défaut fait exactement ce que
vous souhaitez. Ça peut donc donner cela (en supposant que $line
contient la ligne à traiter) :

$line = join(";", split $line);

ou :

$line = join(";", (split $line), "n");

(pour garder le "n" en fin de ligne.)

On peut aussi passer par des susbstitutions :

$line =~ s/^s*//; # suppression des espaces au début
$line =~ s/s*$//; # suppression des espaces à la fin
$line =~ s/s+/;/g; # remplacement des espaces par ;

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Ezechiel
Mag wrote:
Bonjour,

débutante ;=) merci d'avance pour votre aide.


J'ai une variable qui ressemble a cela:

192.168.10.47 4 65500 2050682 257839 63672463 0 0 6w4d

elle peut etre aussi:

192.168.10.2 4 5500 2050682 257839 63672463 0 0 6w4d

en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est
pas "fixe"

comment obtenir un:
192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d
sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un
espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere
de la ligne)

Mag


heu, et pourquoi pas un truc du genre :

join(';', unpack("A15A3A7A8A8A9A5A5A5", $_));

Cordialement,
Ezechiel

Avatar
Paul Gaborit
À (at) Mon, 26 May 2008 10:05:35 +0200,
Ezechiel écrivait (wrote):
heu, et pourquoi pas un truc du genre :

join(';', unpack("A15A3A7A8A8A9A5A5A5", $_));


C'est une autre approche où on considère que chaque champ est
représenté par un nombre de caractères fixe.

Mais elle présente deux inconvénients à mes yeux :

1- elle ne supprime pas les blancs inutiles (ça peut se corriger
facilement).

2- ce genre d'affichage est généralement créé par un appel à printf
avec des %Ns où N est la taille de chaque champ. Mais le N est une
taille *minimum* et printf risque d'afficher plus de N caractères si
le champ en a besoin. Et donc, la taille fixe ne sera plus respectée.
Je ne sais pas si ça peut réellement arrivé dans ce cas précis mais je
m'en méfie toujours...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>