Effacer une chaine de caracteres séparée par;
Résolu/Fermé
A voir également:
- Effacer une chaine de caracteres séparée par;
- Caractères ascii - Guide
- Chaine tnt gratuite sur mobile - Guide
- Comment effacer une page sur word - Guide
- Caractères spéciaux clavier azerty - Guide
- Caractères spéciaux - Guide
7 réponses
miramaze
Messages postés
1429
Date d'inscription
mercredi 29 juillet 2009
Statut
Contributeur
Dernière intervention
1 mai 2022
92
19 janv. 2010 à 22:34
19 janv. 2010 à 22:34
Salut, je me suis penché sur ton souci et j'ai un code qui fonctionne pour l'exemple cité ci-dessus. Tu m'excuseras, je l'ai fais en perl, pas en bash. Tu excuseras aussi la piètre qualité de ce code je l'ai fais un peu à l'arrache, j'aurais pû utiliser une expression régulière complexe et résoudre ça en deux ligne mais bon j'avais pas envie de me casser le cul.
Tu le lances dans un terminal, tu saisis le chemin ton fichier et rouler jeunesse (évidemment fais des essais sur un fichier de test avant mais tu y auras pensé j'imagine)
Tu le lances dans un terminal, tu saisis le chemin ton fichier et rouler jeunesse (évidemment fais des essais sur un fichier de test avant mais tu y auras pensé j'imagine)
#/usr/bin/perl use strict; print "Saisissez le chemin complet du document à modifier"; my $saisie = <STDIN>; chomp($saisie); my @resultat; open(FICHIER, "$saisie"); foreach(<FICHIER>) { if($_ =~ /;/) { $_ =~ s/,(.*?);/ ,/g; $_ =~ s/,\*,\*//g; push(@resultat, $_); } else { $_ =~ /(.*?),/; push(@resultat, $1); } } close(FICHIER); open(FICHIER, ">$saisie"); foreach(@resultat) { chomp; $_ =~ s/\s+/ /g; print FICHIER $_."\n"; } close(FICHIER);
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
20 janv. 2010 à 09:51
20 janv. 2010 à 09:51
hello
avec awk
avec awk
$ cat a2 adoma : sampec , 13510 , eguilles adoma : serti , 84700 , sorgues assistance publique hopitaux de paris : delamy charles , 75015, paris;etb,*,*;andriot,*,* centre hospitalier henri guerin : arc'h,*,* ; pba,*,*;athedia,*,*;sovebat,*,* chu de saint etienne:chromsystems,*,*;dade behring,*,*;lgc,*,* $ $ awk -F"[:;,]" '{for(n=1;n<=NF;n++){x=$n;gsub(" ","",x);if(x ~ /^[0-9]/){$(n+1)="";n++;continue};if(x ~ /\*/)continue ; n==1?c=":":c=",";printf("%s%c", $n,c)};print ""}' < a2|sed 's/,$//' adoma : sampec adoma : serti assistance publique hopitaux de paris : delamy charles ,etb,andriot centre hospitalier henri guerin : arc'h, pba,athedia,sovebat chu de saint etienne:chromsystems,dade behring,lgc $
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
20 janv. 2010 à 10:07
20 janv. 2010 à 10:07
Salut,
;-))
[tmpfs]$ cat plop 1) adoma : sampec , 13510 , eguilles 2) adoma : serti , 84700 , sorgues 3) assistance publique hopitaux de paris : delamy charles , 75015, paris;etb,*,*;andriot,*,* 4) centre hospitalier henri guerin : arc'h,*,* ; pba,*,*;athedia,*,*;sovebat,*,* 5) chu de saint etienne:chromsystems,*,*;dade behring,*,*;lgc,*,* [tmpfs]$ sed 's/,[^;]*//g;s/;/,/g' plop 1) adoma : sampec 2) adoma : serti 3) assistance publique hopitaux de paris : delamy charles ,etb,andriot 4) centre hospitalier henri guerin : arc'h, pba,athedia,sovebat 5) chu de saint etienne:chromsystems,dade behring,lgc [tmpfs]$
;-))
Salut,
Une autre solution perl ;-)
$ cat plop
1) adoma : sampec , 13510 , eguilles
2) adoma : serti , 84700 , sorgues
3) assistance publique hopitaux de paris : delamy charles , 75015, paris;etb,*,*;andriot,*,*
4) centre hospitalier henri guerin : arc'h,*,* ; pba,*,*;athedia,*,*;sovebat,*,*
5) chu de saint etienne:chromsystems,*,*;dade behring,*,*;lgc,*,*
$ perl -pe 'if(/;/){s/(?<=,).*?;|,\*.\*$//g}else{s/\s*,.*//}' plop
1) adoma : sampec
2) adoma : serti
3) assistance publique hopitaux de paris : delamy charles ,etb,andriot
4) centre hospitalier henri guerin : arc'h, pba,athedia,sovebat
5) chu de saint etienne:chromsystems,dade behring,lgc
Une autre solution perl ;-)
$ cat plop
1) adoma : sampec , 13510 , eguilles
2) adoma : serti , 84700 , sorgues
3) assistance publique hopitaux de paris : delamy charles , 75015, paris;etb,*,*;andriot,*,*
4) centre hospitalier henri guerin : arc'h,*,* ; pba,*,*;athedia,*,*;sovebat,*,*
5) chu de saint etienne:chromsystems,*,*;dade behring,*,*;lgc,*,*
$ perl -pe 'if(/;/){s/(?<=,).*?;|,\*.\*$//g}else{s/\s*,.*//}' plop
1) adoma : sampec
2) adoma : serti
3) assistance publique hopitaux de paris : delamy charles ,etb,andriot
4) centre hospitalier henri guerin : arc'h, pba,athedia,sovebat
5) chu de saint etienne:chromsystems,dade behring,lgc
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re,
Oups j'ai oubile ?:
Oups j'ai oubile ?:
$ cat plop 1) adoma : sampec , 13510 , eguilles 2) adoma : serti , 84700 , sorgues 3) assistance publique hopitaux de paris : delamy charles , 75015, paris;etb,*,*;andriot,*,* 4) centre hospitalier henri guerin : arc'h,*,* ; pba,*,*;athedia,*,*;sovebat,*,* 5) chu de saint etienne:chromsystems,*,*;dade behring,*,*;lgc,*,* $ perl -pe '/;/?s/(?<=,).*?;|,\*.\*$//g:s/\s*,.*//;' plop1) adoma : sampec 2) adoma : serti 3) assistance publique hopitaux de paris : delamy charles ,etb,andriot 4) centre hospitalier henri guerin : arc'h, pba,athedia,sovebat 5) chu de saint etienne:chromsystems,dade behring,lgc
miramaze
Messages postés
1429
Date d'inscription
mercredi 29 juillet 2009
Statut
Contributeur
Dernière intervention
1 mai 2022
92
20 janv. 2010 à 10:45
20 janv. 2010 à 10:45
Et oui je voyais bien ce genre de truc à implémenter mais j'avais la flemme de trop réfléchir ;)
Bravo !
Bravo !
Re,
Disons que ça m'arrive souvent de chercher le pourquoi ;-)
car sur certaines lignes , elle m'a laissé le code postale et la ville sur le dernier (exemple: commune de clichy la garenne: tricaud, neveu sudaka, lysias partners,75008,paris) alors que le resultat doit etre: commune de clichy la garenne: tricaud, neveu sudaka, lysias partners. Mais ce n'est pas grave puisque j'ai utilisé sed et awk.
Voici ce que j'obtiens d'après les tests
Avec sed
Avec perl
Avec awk (j'ai enlevé la numérotation au début)
Seule la 1ère solution awk donnée par dubcek fonctionne à condition qu'on enlève le N) au début.
Elle fonctionne puisque justement il a séparé les champs.
Ce que qu'on n'a pas avec sed et perl.
D'ailleurs ton info de début n'est pas précis.
Tu dis
, ma ligne est composée de plusieurs noms d'entreprises avec leurs codes postaux est ces derniers sont séparés par un point virgule ";"
Sur la ligne qui ne fonctionne pas, c'est normal puisqu'il n'y a pas de point virgule, contraire à ce que tu as dit.
Le teste je l'ai fait sur ;
(exemple: commune de clichy la garenne: tricaud, neveu sudaka, lysias partners,75008,paris)
Il est où le point virgule sur ta ligne?
Après une nouvelle analyse selon la nouvelle ligne (mais que cache encore ton fichier ? ;-), en plus j'ai ajouté une ligne supplémentaires
Cette fois je n'ai pas pris en compte le ; mais le code postal (5 chiffre pour la France)
Conclusion : sans une connaissance exacte de fichier en entrée on a toujours la chance de trouver une solution incomplète.
Maintenant que la solution de dubcek t'arrange, c'est très bien.
il est vrai que ma méthode de tester chaque champ est plutôt lourde;
Peut être lourde mais il s'avère plus exacte ;-)
Disons que ça m'arrive souvent de chercher le pourquoi ;-)
car sur certaines lignes , elle m'a laissé le code postale et la ville sur le dernier (exemple: commune de clichy la garenne: tricaud, neveu sudaka, lysias partners,75008,paris) alors que le resultat doit etre: commune de clichy la garenne: tricaud, neveu sudaka, lysias partners. Mais ce n'est pas grave puisque j'ai utilisé sed et awk.
Voici ce que j'obtiens d'après les tests
lami20j@debian:~$ cat plop 1) adoma : sampec , 13510 , eguilles 2) adoma : serti , 84700 , sorgues 3) assistance publique hopitaux de paris : delamy charles , 75015, paris;etb,*,*;andriot,*,* 4) centre hospitalier henri guerin : arc'h,*,* ; pba,*,*;athedia,*,*;sovebat,*,* 5) chu de saint etienne:chromsystems,*,*;dade behring,*,*;lgc,*,* 6) commune de clichy la garenne: tricaud, neveu sudaka, lysias partners,75008,paris
Avec sed
lami20j@debian:~$ sed 's/,[^;]*//g;s/;/,/g' plop 1) adoma : sampec 2) adoma : serti 3) assistance publique hopitaux de paris : delamy charles ,etb,andriot 4) centre hospitalier henri guerin : arc'h, pba,athedia,sovebat 5) chu de saint etienne:chromsystems,dade behring,lgc 6) commune de clichy la garenne: tricaud
Avec perl
lami20j@debian:~$ perl -pe '/;/?s/(?<=,).*?;|,\*.\*$//g:s/\s*,.*//;' plop 1) adoma : sampec 2) adoma : serti 3) assistance publique hopitaux de paris : delamy charles ,etb,andriot 4) centre hospitalier henri guerin : arc'h, pba,athedia,sovebat 5) chu de saint etienne:chromsystems,dade behring,lgc 6) commune de clichy la garenne: tricaud
Avec awk (j'ai enlevé la numérotation au début)
lami20j@debian:~$ awk '{gsub(",[^;]*","",$0);gsub(";",",",$0);print}' < plop adoma : sampec adoma : serti assistance publique hopitaux de paris : delamy charles ,etb,andriot centre hospitalier henri guerin : arc'h, pba,athedia,sovebat chu de saint etienne:chromsystems,dade behring,lgc commune de clichy la garenne: tricaud
Seule la 1ère solution awk donnée par dubcek fonctionne à condition qu'on enlève le N) au début.
Elle fonctionne puisque justement il a séparé les champs.
Ce que qu'on n'a pas avec sed et perl.
D'ailleurs ton info de début n'est pas précis.
Tu dis
, ma ligne est composée de plusieurs noms d'entreprises avec leurs codes postaux est ces derniers sont séparés par un point virgule ";"
Sur la ligne qui ne fonctionne pas, c'est normal puisqu'il n'y a pas de point virgule, contraire à ce que tu as dit.
Le teste je l'ai fait sur ;
(exemple: commune de clichy la garenne: tricaud, neveu sudaka, lysias partners,75008,paris)
Il est où le point virgule sur ta ligne?
Après une nouvelle analyse selon la nouvelle ligne (mais que cache encore ton fichier ? ;-), en plus j'ai ajouté une ligne supplémentaires
Cette fois je n'ai pas pris en compte le ; mais le code postal (5 chiffre pour la France)
~$ cat plop 1) adoma : sampec , 13510 , eguilles 2) adoma : serti , 84700 , sorgues 3) assistance publique hopitaux de paris : delamy charles , 75015, paris;etb,*,*;andriot,*,* 4) centre hospitalier henri guerin : arc'h,*,* ; pba,*,*;athedia,*,*;sovebat,*,* 5) chu de saint etienne:chromsystems,*,*;dade behring,*,*;lgc,*,* 6) commune de clichy la garenne: tricaud, neveu sudaka, lysias partners,75008,paris 7) commune de clichy la garenne: tricaud, neveu sudaka,31000,toulouse,lysias partners,75008,paris ~$ perl -pe 's/\s*(\d{5}|\*)\s*,\s*.*?(,|;|$)//g;s/\s*,$//g' plop 1) adoma : sampec 2) adoma : serti 3) assistance publique hopitaux de paris : delamy charles ,etb,andriot 4) centre hospitalier henri guerin : arc'h, pba,athedia,sovebat 5) chu de saint etienne:chromsystems,dade behring,lgc 6) commune de clichy la garenne: tricaud, neveu sudaka, lysias partners 7) commune de clichy la garenne: tricaud, neveu sudaka,lysias partners
Conclusion : sans une connaissance exacte de fichier en entrée on a toujours la chance de trouver une solution incomplète.
Maintenant que la solution de dubcek t'arrange, c'est très bien.
il est vrai que ma méthode de tester chaque champ est plutôt lourde;
Peut être lourde mais il s'avère plus exacte ;-)