Effacer une chaine de caracteres séparée par;

Résolu
Utilisateur anonyme -  
 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???
Configuration: Windows Vista Internet Explorer 7.0

7 réponses

  1. miramaze Messages postés 1429 Date d'inscription   Statut Contributeur Dernière intervention   92
     
    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)

    #/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);
    
    0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    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
    $ 
    
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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]$

    ;-))
    0
  4. lami20j
     
    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
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j
     
    Re,

    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
    0
  7. miramaze Messages postés 1429 Date d'inscription   Statut Contributeur Dernière intervention   92
     
    Et oui je voyais bien ce genre de truc à implémenter mais j'avais la flemme de trop réfléchir ;)
    Bravo !
    0
  8. lami20j
     
    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

    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 ;-)
    0