Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/11/2010, 11h40   #1
Invité de passage
 
Inscription : octobre 2008
Messages : 9
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : octobre 2008
Messages : 9
Points : 0
Points : 0
Par défaut Enlever des caractères d'une variable

Bonjour à tous,

Voilà, j'ai besoin d'un peu d'aide. Je dois réaliser un croisement entre une table de notre base de données et un tableau excel qui m'a été envoyé.

La clé de jointure est un identifiant spécifique à chaque dossier.

Le problème est que, dans mon fichier Excel, cet identifiant n'est pas du même format que celui de ma table.
En effet, dans ma table, j'ai des identifiants de ce genre: "425733" ou "13" ou "654" . Dans mon tableau Excel, j'ai "00013", "014365", "0397384 D"," 427665", "01324E" etc...
Pour m'y retrouvé, j'ai besoin de supprimer les caractères pouvant se trouver dans ma variable ainsi que les 0 au début de celle-ci. Etant donné que la longueur de ma chaine de caractère varie, je suis un peu paumé quant à la méthode à appliquer.

Merci d'avance
vince_est est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 12h00   #2
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Par défaut perl

Salut, il y a pas mal de solutions à ton problème. La plus intéressante (à mon avis) est d'avoir recours aux expressions régulières.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
DATA caractere;
input clecar $14.;
cards;
00013
014365
0397384 D
0000030008 DR70007
;
run;
 
 
DATA cle;
retain reg_cle;
IF _n_=1 then do;
 
	reg_cle=prxparse("/0*(\d+)/");
 
end;
 
SET caractere;
 
pos=prxmatch(reg_cle, clecar);
IF  pos then cle=input(prxposn(reg_cle, 1, clecar), best.);
run;
pour avoir des infos sur les expressions régulières, google:
Code :
perl site:sas.com filetype:pdf
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/11/2010, 14h28   #3
Invité de passage
 
Inscription : octobre 2008
Messages : 9
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : octobre 2008
Messages : 9
Points : 0
Points : 0
Je ne connaissais pas cette fonction et je n'aurais jamais trouvé ça tout seul.

En tout cas, ça fonctionne impeccable, merci beaucoup de ton aide.
vince_est est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 14h49   #4
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
Stl,

pas forcement mieux, mais plus simple :

COMPRESS Function

x
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 14h54   #5
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 134
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 134
Points : 1 746
Points : 1 746
la compress risque de virer les 0 qquelquesoit l'endroit non? par exemple sur la valeur 0012302?
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h20   #6
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
correct! j'avais pas vu
Citation:
ainsi que les 0 au début de celle-ci.
mais bon :
Code :
1
2
3
4
5
DATA _NULL_;
   x = '0397384 D';
   z = input(compress(x, 'D '), best.);
   put z =;
run;
Mais il ne faudrait pas avoir :
X
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 22h22   #7
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 946
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 946
Points : 1 355
Points : 1 355
Je te propose une solution qui n'est surement pas la plus optimale.
Si l'alphabet évolue d'ici là, tu le rajouteras à la macro &liste
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
DATA caractere;
input clecar $14.;
cards;
00013
014365
0397384 D
0000030008 
DR70007
;
run;
 
%LET liste=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z;
 
%MACRO CONVERSION;
DATA  Numerique;
	SET caractere;
	%DO i=1 %TO 26;
		%LET liste&i=%SCAN(&liste.,&i.,' ');/* Scan la liste &liste.*/
		clecar=tranwrd(clecar,"&&liste&i.",' ');/* remplace du alpha-numérique par un blanc*/
		U=clecar*1;/* conversion en numérique*/
	%END;
	RUN;
%MEND CONVERSION;
 
%CONVERSION;;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 12h00   #8
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Citation:
Envoyé par xav2229 Voir le message
correct! j'avais pas vu

mais bon :
Code :
1
2
3
4
5
DATA _NULL_;
   x = '0397384 D';
   z = input(compress(x, 'D '), best.);
   put z =;
run;
Mais il ne faudrait pas avoir :
X
Bonjour,
Ta solution est bonne, ce qui est demandé
supprimer les caractères de la chaine (la fonction compress le fait bien)
supprimer le premier caractère si c'est un zero (la convertion de la chaine numérque avec la fonction input répond à se besoin).
Je rajoute un truc pour généraliser le traitement:
Code :
1
2
3
4
5
DATA _NULL_;
   x = '039738SDFSFD4 Da';
   z = input(compress(x, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','i'), best.);
   put z =;
run;
l'option "i" : traiter les majuscules et les minuscules.
Salah
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h44.


 
 
 
 
Partenaires

Hébergement Web