2009-09-09 4 views
8

Si j'ai une variable numérique avec un format, existe-t-il un moyen d'obtenir la valeur formatée en tant que variable de caractère?Comment puis-je faire une variable de caractère égale à la valeur formatée d'une variable numérique pour des formats SAS arbitraires?

par exemple. Je voudrais écrire quelque chose comme ce qui suit pour imprimer 10/06/2009 à l'écran mais il n'y a pas de fonction putformatted().

data test; 
    format i ddmmyy10.; 
    i = "10JUN2009"d; 
run; 

data _null_; 
    set test; 
    i_formatted = putformatted(i); /* How should I write this? */ 
    put i_formatted; 
run; 

(Il est évident que je peux écrire put(i, ddmmyy10.), mais mon code doit travailler pour quelque format i arrive à avoir.)

Répondre

9

La fonction VVALUE formats la variable passée à l'aide du format associé à la variable. Voici le code à l'aide VVALUE:

data test; 
    format i ddmmyy10.; 
    i = "10JUN2009"d; 
run; 

data _null_; 
    set test; 
    i_formatted = vvalue(i); 
    put i_formatted; 
run; 

Alors que la solution de cmjohns est légèrement plus rapide que ce code, ce code est plus simple car il n'y a pas de macros impliquées.

+0

+1: juste ce que je recherchais. Je vous remercie! –

3

je peux le faire avec le code macro et sashelp.vcolumn mais il est un peu Checklist.

proc sql noprint; 
    select trim(left(format)) into :format 
    from sashelp.vcolumn 
    where libname eq 'WORK' and memname eq 'TEST'; 
run; 

data test2; 
    set test; 
    i_formatted = put(i, &format); 
    put i_formatted; 
run; 
+0

J'aime ça sur cmjohns ' –

+0

@Chang Chung Je sais que c'est une vieille question, mais j'ai été redirigé ici. Y a-t-il une raison pour laquelle vous préférez cela à la solution de cmjohns? @Simon Même question: pourquoi l'appelles-tu un peu compliqué? Est-ce que ce n'est pas 100% stable? – Yoh

+0

@Yohsoog: ça marche, et c'est stable. J'espérais juste qu'il y avait un moyen de le faire sans regarder dans sashelp.vcolumn. –

5

Cela a semblé fonctionner pour un couple que j'ai essayé. J'ai utilisé VARFMT et une fonction macro pour récupérer le format de la variable donnée.

data test; 
    format i ddmmyy10. b comma12.; 
    i = "10JUN2009"d; 
    b = 123405321; 
run; 


%macro varlabel(variable) ; 
    %let dsid=%sysfunc(open(&SYSLAST.)) ; 
    %let varnum=%sysfunc(varnum(&dsid,&variable)) ; 
    %let fmt=%sysfunc(varfmt(&dsid,&varnum)); 
    %let dsid=%sysfunc(close(&dsid)) ; 
    &fmt 
%mend varlabel; 

data test2; 
    set test; 
    i_formatted = put(i, %varlabel(i)); 
    b_formatted = put(b, %varlabel(b)); 
    put i_formatted=; 
    put b_formatted=; 
run; 

Cela m'a donné:

i_formatted=10/06/2009 
b_formatted=123,405,321 
+0

+1, et j'accepte cette réponse parce qu'elle est considérablement plus rapide que putn (i, vformat (i)). Pour 10 millions d'observations, cette méthode a pris 10 secondes, contre 65 secondes. –

7

Utilisez la fonction vformat().

/* test data */ 
data test; 
    i = "10jun2009"d; 
    format i ddmmyy10.; 
run; 

/* print out the value using the associated format */ 
data _null_; 
    set test; 
    i_formatted = putn(i, vformat(i)); 
    put i_formatted=; 
run; 
/* on log 
i_formatted=10/06/2099 
*/ 
+0

+1 J'aime ça, et je ne connaissais pas putn() ou vformat() auparavant, mais j'accepte la réponse de cmjohns pour des raisons de performances. –

0

Oui, il existe une fonction putformatted(). En fait, il y en a deux: putc() et putn(). Putc gère les formats de caractères, putn() numérique. Votre code devra regarder le nom de format (tous et seulement les formats de caractères commençant par "$") déterminent lequel utiliser. Voici la syntaxe de putc (de l'aide interactive):

PUTC(source, format.<,w>) 

Arguments

source 
is the SAS expression to which you want to apply the format. 

format. 
is an expression that contains the character format you want to apply to source. 

w 
specifies a width to apply to the format. 

Interaction: If you specify a width here, it overrides any width specification 
in the format. 
+0

Mais je dois fournir le format: le point de la question était de savoir s'il y avait un moyen de mise en forme avec le format courant de la variable –

Questions connexes