Привет!
Я новый участник этого замечательного проекта. Мой опыт не такой богатый, как у Николая, но думаю, что мне есть чем поделиться.
Сегодня я хочу рассказать о возможной проблеме с длиной строк при импорте из Excel.
Допустим, вам необходимо залить табличку из Excel, в которой присутствуют русские символы. Например такого типа:
У вас есть несколько вариантов, но самый простой это процедура IMPORT:
libname temp «sas-directory»;
proc import
out= temp.example
datafile= «табличка.xlsx»
dbms= XLSX replace;
sheet=»test»;
getnames=yes;
run;
И вроде бы всё нормально, но мы встречаемся с тем в строке появились ненужные дополнительные символы, которые при записи выглядят как пробелы.
Вы возможно скажете, что trim(varname) нам поможет, но, к сожалению, это не так.
Попробуем разобраться, обратимся к получившейся табличке и запишем значения переменной и значение, получившееся после функции trim:
data _null_;
set temp.example (obs=1);
file ‘d:sas_exampletemp.txt’;
put var;
k = trim(var);
put k;
run;
Для удаления этих пробелов существует такая замечательная функция COMPRESS.
Кто-то скажет, что надо просто сделать COMPRESS(var, ’09’x), так как пробелы соответствуют значению 09 в таблице кодов, но данные пробелы не соответствуют коду ’09’x.
Кстати, если бы нам надо было удалить все специальные символы (в данном случае речь идёт о символах юникода), то можно было просто воспользоваться параметрами функции COMPRESS(var, ,’kw’). Но нам надо удалить конкретные значения.
Сначала выясним, какие значения нам необходимо удалить, записав каждый символ и его код отдельно:
data _null_;
set temp.example (obs=1);
file ‘d:sas_exampletemp.txt’;
do i = 1 to length(var);
b = substr(var, i, 1);
a = put(b,$HEX2.);
put b a ;
end;
run;
Оказывается, за этими пробелами стоят значения ’00’x. Теперь мы можем удалить их все через функцию с параметром COMPRESS(var, ’00’x).
Спасибо за прочтение и до свидания!