Suppression des espaces pour recuperer les données ?

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #6701801
In article 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)


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;

Nicolas George
Le #6702121
Marc Espie wrote in message
@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.

Paul Gaborit
Le #6703791
À (at) Sun, 25 May 2008 07:13:59 +0200,
Mag
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 - Perl en français -
Ezechiel
Le #6707661
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

Paul Gaborit
Le #6709091
À (at) Mon, 26 May 2008 10:05:35 +0200,
Ezechiel
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 - Perl en français -
Publicité
Poster une réponse
Anonyme