2009-09-09 3 views
8

Wenn ich eine numerische Variable mit einem Format habe, gibt es eine Möglichkeit, den formatierten Wert als Zeichenvariable zu erhalten?Wie kann ich eine Zeichenvariable dem formatierten Wert einer numerischen Variablen für beliebige SAS-Formate gleich machen?

z.B. Ich möchte etwas wie das Folgende schreiben, um 10/06/2009 auf den Bildschirm zu drucken, aber es gibt keine putformatted() Funktion.

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; 

(Natürlich kann ich schreiben put(i, ddmmyy10.), aber mein Code muss für die Arbeit, was auch immer Format i haben passiert.)

Antwort

9

Die VVALUE Funktion formatiert die Variable an sie übergeben das Format mit der Variablen verbunden. Hier ist der Code VVALUE mit:

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

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

Während cmjohns Lösung ist etwas schneller als dieser Code, dieser Code ist einfacher, weil es keine beteiligt Makros.

+0

+1: nur was ich wollte. Vielen Dank! –

3

Ich kann dies tun mit Makrocode und sashelp.vcolumn aber es ist ein bisschen fummelig.

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

Ich mag dies über cmjohns –

+0

@Chang Chung Ich weiß, es ist eine alte Frage, aber ich wurde hier umgeleitet. Gibt es einen Grund, warum Sie diese Lösung über cmjohns bevorzugen? @Simon Die gleiche Frage an Sie: Warum nennen Sie es ein bisschen knifflig? Ist es nicht 100% stabil? – Yoh

+0

@ Yohsoog: es funktioniert, und es ist stabil. Ich habe nur gehofft, dass es einen Weg gibt, es zu tun, ohne in sashelp.vcolumn zu schauen. –

5

Dies schien für ein Paar, das ich versuchte, zu arbeiten. Ich benutzte VARFMT und eine Makrofunktion, um das Format der gegebenen Variable abzurufen.

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; 

Das gab mir:

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

+1, und ich akzeptiere diese Antwort, weil sie wesentlich schneller ist als putn (i, vformat (i)). Bei 10 Millionen Beobachtungen dauerte diese Methode 10 Sekunden, verglichen mit 65 Sekunden. –

7

Verwenden vformat() Funktion.

/* 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 Ich mag das und wusste vorher weder putn() noch vformat(), aber ich akzeptiere cmjohns 'Antwort aus Leistungsgründen. –

0

Ja, es gibt eine putformatted() - Funktion. Tatsächlich gibt es zwei: putc() und putn(). Putc verarbeitet Zeichenformate, putn() numerisch. Ihr Code muss sich den Namen des Formats ansehen (alle und nur die Zeichenformate beginnen mit "$"), um festzulegen, welche verwendet werden soll. Hier ist die Syntax von putc (von der interaktiven Hilfe):

PUTC(source, format.<,w>) 

Argumente

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

Aber ich muss das Format liefern: Der Punkt der Frage war herauszufinden, ob es eine Möglichkeit der Formatierung mit dem aktuellen Format für die Variable –

Verwandte Themen