Обработка нестандартных пробелов

Привет!

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

Сегодня я хочу рассказать о возможной проблеме с длиной строк при импорте из 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_example\temp.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_example\temp.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).

Спасибо за прочтение и до свидания!

Ярлыки: , ,