Как дополнить символьные поля в SAS? - PullRequest
7 голосов
/ 07 ноября 2011

Я создаю набор данных SAS из базы данных, которая включает ключевое поле VARCHAR (5).

В этом поле содержатся некоторые записи, которые используют все 5 символов, а некоторые используют меньше.

Когда я импортирую эти данные, я бы предпочел заполнить все более короткие записи, чтобы использовать все пять символов.В этом примере я хочу добавить слева значение 0, символ ноль.Итак, 114 станет 00114, ABCD станет 0ABCD, а EA222 останется без изменений.

Я попытался сделать это с помощью простого оператора данных, но, конечно,следующее не работает:

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

Я пытался сделать это с помощью пользовательской информации, но я не думаю, что можно правильно указать диапазоны в символьных полях, для этот ответ SAS KB .Кроме того, я уверен, что формат proc не позволит мне определить результат динамически в терминах входящей переменной.

Я уверен, что здесь есть очевидное решение, но я просто его упускаю.

Ответы [ 5 ]

6 голосов
/ 21 февраля 2012

Вот альтернатива:

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;
4 голосов
/ 10 января 2013
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;
2 голосов
/ 08 ноября 2011

Я уверен, что у кого-то будет более элегантное решение, но следующий код работает. По сути, это заполнение переменной пятью начальными нулями, затем обратный порядок этой текстовой строки, чтобы нули были вправо, затем обратный ход этой текстовой строки и ограничение размера до пяти символов в исходном порядке, но с левым отступом с нулями.

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 голосов
/ 10 сентября 2014

Я использую это, но работает только с числовыми значениями: S.Попробуйте с другими форматами в INPUT

data work.prueba;
    format xx $5.;
    xx='1234';
    vv=PUT(INPUT(xx,best5.),z5.);
run;
0 голосов
/ 26 августа 2014

Вот что у меня сработало.

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

Он работает, считая длину существующей строки, а затем создавая строку cat длины 4 - that, а затем добавляя вместе значение cat и исходную строку.

Обратите внимание, что он облажается, если длина исходной строки 5. Также - это не будет работать, если входная строка имеет $ 5. формат на нем.

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   
...