2009-09-09 25 views
8

Nếu tôi có biến số có định dạng, có cách nào để nhận giá trị được định dạng dưới dạng biến ký tự không?Làm cách nào để tạo biến ký tự bằng giá trị được định dạng của biến số cho các định dạng SAS tùy ý?

ví dụ: Tôi muốn viết một cái gì đó như sau để in 10/06/2009 vào màn hình nhưng không có chức năng 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; 

(Rõ ràng là tôi có thể viết put(i, ddmmyy10.), nhưng mã của tôi cần phải làm việc cho bất cứ định dạng i xảy ra để có.)

Trả lời

9

Các VVALUE chức năng định dạng các biến được truyền cho nó bằng cách sử dụng định dạng liên quan đến việc thay đổi. Dưới đây là các mã sử dụng VVALUE:

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

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

Trong khi cmjohns giải pháp là nhanh hơn một chút so với mã này, mã này là đơn giản bởi vì không có macro có liên quan.

+0

+1: chỉ là những gì tôi đã theo dõi. Cảm ơn bạn! –

3

tôi có thể làm điều này với mã vĩ mô và sashelp.vcolumn nhưng đó là một chút khó sử dụng.

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

Tôi thích điều này trên cmjohns ' –

+0

@ Chung Chung Tôi biết đó là một câu hỏi cũ, nhưng tôi đã được chuyển hướng đến đây. Có lý do nào tại sao bạn thích giải pháp này hơn cmjohns không? @Simon Cùng một câu hỏi cho bạn: tại sao bạn gọi nó một chút khó sử dụng? Nó không phải là 100% ổn định? – Yoh

+0

@ Yohsoog: nó hoạt động và ổn định. Tôi chỉ hy vọng có một cách để làm điều đó mà không cần nhìn vào sashelp.vcolumn. –

5

Điều này dường như hoạt động đối với cặp vợ chồng mà tôi đã thử. Tôi đã sử dụng VARFMT và một hàm macro để truy lục định dạng của biến đã cho.

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; 

này đã cho tôi:

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

+1 và tôi chấp nhận câu trả lời này vì nó nhanh hơn đáng kể so với putn (i, vformat (i)). Đối với 10 triệu quan sát, phương pháp này mất 10 giây, so với 65 giây. –

7

Sử dụng vformat() chức năng.

/* 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 Tôi thích điều này và không biết về putn() hoặc vformat() trước đây, nhưng tôi chấp nhận câu trả lời của cmjohns vì lý do hiệu suất. –

0

Có, có hàm putformatted(). Trong thực tế, có hai: putc() và putn(). Putc xử lý các định dạng ký tự, số putn(). Mã của bạn sẽ cần phải nhìn vào tên định dạng (tất cả và chỉ các định dạng ký tự bắt đầu bằng "$") để xác định sử dụng. Đây là cú pháp của putc (từ sự giúp đỡ tương tác):

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

Nhưng tôi phải cung cấp định dạng: điểm của câu hỏi là để tìm hiểu xem có cách nào định dạng với định dạng hiện tại cho biến số –

Các vấn đề liên quan