Что идет не так, когда вы используете формат
format zone $test.;
С, вы создали переменную zone
с внутренней длиной $5
(пять знаков). Для доказательства того, что, запустить
proc contents data=output;
run;
С zone = region;
присвоить значение вашей region
к zone
, который затем усекается до 5 символов. Метка применяется только при печати или перепечатке данных. В этот момент переменная zone
содержит текст «regio», который не находится в одном из диапазонов start
до end
и, следовательно, не переведен.
Как вы можете вылечить это, когда, используя формат
Один из способов вылечить это применить формат уже когда присвоить значение zone
, написание zone = put(region, $test);
.
Еще один вариант заключается в том, чтобы явно указать длину хранилища зоны с length zone $7;
перед тем, как дать ему формат, или сделать оба сразу с format zone $test.;
, как и на другой ответ.
Почему этот формат ведет себя таким образом
Когда вы создаете символьный формат, используя cntlin
, в proc format
, он получает как длина максимальная длина этикетки, в вашем случае 5 символов. Эта длина - это количество символов, с которыми сохраняется переменная с этим форматом. Вы можете видеть, что если вы запустите
proc format library = work.formats
cntlin = work.formatset;
run;
Это не логично, на самом деле, и что еще хуже, вы не можете изменить это, указав длину в вашем cntlin
наборе данных.
Как вылечить его в самом формате
Просто указать любое значение, для которого формат должен показывать что-то из 8 байтов:
data formatset;
input fmtname $ start $ end $ label $;
datalines;
$test region1 region3 zone1
$test region4 region5 zone2
$test region6 region7 zone3
$test _dummy_ _dummy_ 1234567
;
run;