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

Résolu/Fermé
Utilisateur anonyme - 19 janv. 2010 à 21:49
 lami20j - 20 janv. 2010 à 17:48
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???
A voir également:

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
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
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 janv. 2010 à 09:51
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
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]$

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
Et oui je voyais bien ce genre de truc à implémenter mais j'avais la flemme de trop réfléchir ;)
Bravo !
0
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