Effacer une chaine de caracteres séparée par;
Résolu
Utilisateur anonyme
-
lami20j -
lami20j -
Bonjour,
j'ai le fichier nomé mon_fichier qui se compose de deux champs. Ces deux champs sont séparés par ":" . Le 1er champ est un nom (que des lettres) mais le deuxieme champ lui meme est composé de trois variables séparées par une virgule et se sont le nom d'entreprise + un code postal+ une ville (nom entreprise, CP, ville). Par contre, sur certaines lignes (de 3 à 5) , 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 ";" (nom entreprise 1,CP1, ville1 ; nom entreprise2, CP2, ville2....). les etoiles sont des valeurs manquantes , cest a dire que si je n'est pas l'information a propos d'une entreprise concernant son code postale et la ville où elle se trouve, je mets une etoile.
voici un extrait du fichier :
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,*,*
ma question: je veux effacer les codes postaux et les villes et garder que les noms des entreprises. Autrement dit, je veux avoir le resultat suivant si cest possible:
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
comment faire???? je pense à awk mais tous ce que jai trouvé sur awk , est compliqué !! est ce que quelqu'un peut m'aider svp???
j'ai le fichier nomé mon_fichier qui se compose de deux champs. Ces deux champs sont séparés par ":" . Le 1er champ est un nom (que des lettres) mais le deuxieme champ lui meme est composé de trois variables séparées par une virgule et se sont le nom d'entreprise + un code postal+ une ville (nom entreprise, CP, ville). Par contre, sur certaines lignes (de 3 à 5) , 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 ";" (nom entreprise 1,CP1, ville1 ; nom entreprise2, CP2, ville2....). les etoiles sont des valeurs manquantes , cest a dire que si je n'est pas l'information a propos d'une entreprise concernant son code postale et la ville où elle se trouve, je mets une etoile.
voici un extrait du fichier :
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,*,*
ma question: je veux effacer les codes postaux et les villes et garder que les noms des entreprises. Autrement dit, je veux avoir le resultat suivant si cest possible:
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
comment faire???? je pense à awk mais tous ce que jai trouvé sur awk , est compliqué !! est ce que quelqu'un peut m'aider svp???
A voir également:
- Effacer une chaine de caracteres séparée par;
- Caractères ascii - Guide
- Caractères spéciaux - Guide
- Chaine tnt gratuite sur mobile - Guide
- Plus de chaine tv - Guide
- Effacer les données de navigation sur android - Guide
7 réponses
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);
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 $
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
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 ;-)