2011-11-07 35 views
7

Tôi đang tạo tập dữ liệu SAS từ cơ sở dữ liệu bao gồm trường khóa VARCHAR (5).Làm cách nào để loại bỏ các trường ký tự trong SAS?

Trường này bao gồm một số mục nhập sử dụng tất cả 5 ký tự và một số sử dụng ít ký tự hơn.

Khi tôi nhập dữ liệu này, tôi muốn đệm tất cả các mục nhập ngắn hơn để sử dụng cả năm ký tự. Đối với ví dụ này, tôi muốn pad ở bên trái với 0, ký tự số không. Vì vậy, 114 sẽ trở thành 00114, ABCD sẽ trở thành 0ABCDEA222 sẽ vẫn như cũ.

Tôi đã cố gắng này với một tuyên bố dữ liệu đơn giản, nhưng tất nhiên sau đó không làm việc:

data test; 
    set databaseinput; 
    format key $5.; 
run; 

Tôi đã cố gắng để làm điều này với một informat người dùng định nghĩa, nhưng tôi không nghĩ rằng có thể chỉ định các dải ô chính xác trên các trường ký tự, theo this SAS KB answer. Ngoài ra, tôi khá chắc chắn định dạng proc sẽ không cho phép tôi xác định kết quả động về mặt biến đến.

Tôi chắc chắn có một giải pháp rõ ràng ở đây, nhưng tôi chỉ thiếu nó.

+0

Bạn muốn xử lý 'ABC' bằng cách nào? Có nên là '00ABC' không? – itzy

+0

Có, '00ABC' là chính xác trong trường hợp của tôi. Ngoài ra, điểm tốt đẹp về việc sử dụng các thẻ mã. Đã cập nhật bài đăng gốc. –

+0

Các mục có thể chứa khoảng trắng không? Ví dụ 'AB_C' hoặc thậm chí' _AB_' (trong đó dấu gạch dưới đại diện cho một khoảng trống)? –

Trả lời

6

Đây là một sự thay thế:

data padded_data_dsn; length key $5; 
    drop raw_data; 
    set raw_data_dsn(rename=(key=raw_data)); 
    key = translate(right(raw_data),'0',' '); 
run; 
2

Tôi chắc chắn ai đó sẽ có giải pháp thanh lịch hơn, nhưng mã sau hoạt động. Về cơ bản nó là đệm biến với năm số 0 đầu, sau đó đảo ngược thứ tự của chuỗi văn bản này để các số không ở bên phải, sau đó đảo ngược chuỗi văn bản này một lần nữa và giới hạn kích thước thành năm ký tự, theo thứ tự ban đầu nhưng với số không.

data raw_data_dsn; 
    format key $varying5.; 
    key = '114'; output; 
    key = 'ABCD'; output; 
    key = 'EA222'; output; 
run; 

data padded_data_dsn; 
    format key $5.; 
    drop raw_data; 
    set raw_data_dsn(rename=(key=raw_data)); 
    key = put(put('00000' || raw_data ,$revers10.),$revers5.); 
run; 
+0

Hãy cho tôi mãi mãi để có được xung quanh để xác nhận câu trả lời này, nhưng nó tại chỗ cho vấn đề của tôi. –

4
Data raw_data_dsn; 
format key $5.; 
key = '4'; key1 = CATT(REPEAT('0',5-length(key)),key);output; 
key = 'A114'; key1 = CATT(REPEAT('0',5-length(key)),key);output; 
key = 'A1140'; key1 = CATT(REPEAT('0',5-length(key)),key);output; 
run; 
0

Đây là những gì làm việc cho tôi.

data b (keep = str2); 
    format str2 $5. ; 
    set a; 
    catlength = 4 - length(str); 
    cat = repeat('0', catlength); 
    str2 = catt(cat, str); 
run; 

Nó hoạt động bằng cách đếm độ dài của chuỗi hiện có, sau đó tạo chuỗi mèo có chiều dài 4 -

Lưu ý rằng nó sẽ vít lên nếu chuỗi gốc có chiều dài 5. Ngoài ra - nó sẽ không hoạt động nếu chuỗi đầu vào có $ 5. định dạng trên đó.

data a; /*input dataset*/ 
    input str $; 
    datalines; 
    a 
    aa 
    aaa 
    aaaa 
    aaaaa 
    ; 
run; 

data b (keep = str2); 
    format str2 $5. ; 
    set a; 
    catlength = 4 - length(str); 
    cat = repeat('0', catlength); 
    str2 = catt(cat, str); 
run; 

input: 
a 
aa 
aaa 
aaaa 
aaaaa 

output: 
0000a 
000aa 
00aaa 
0aaaa 
0aaaa 
0

Tôi sử dụng tính năng này, nhưng chỉ hoạt động với giá trị số: S. Hãy thử với các định dạng khác trong INPUT

data work.prueba; 
    format xx $5.; 
    xx='1234'; 
    vv=PUT(INPUT(xx,best5.),z5.); 
run; 
Các vấn đề liên quan