Функция обрезки SAS / оператор длины - PullRequest
0 голосов
/ 10 апреля 2020

Почему этому коду не нужны два оператора дифферента, один для имени и один для фамилии? Удаляет ли оператор длины пробелы?


data work.maillist; set cert.maillist;
length FullName $ 40;
fullname=trim(firstname)||' '||lastname; 
run;

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

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

Это будет проблемой, только если длина FULLNAME меньше суммы длины FIRSTNAME и LASTNAME плюс один. В противном случае результат не может быть слишком длинным, чтобы поместиться в FULLNAME, даже если в FIRSTNAME или LASTNAME нет завершающих пробелов.

Попробуйте сами с непустыми значениями, чтобы было легче увидеть, что происходит.

1865  data test;
1866    length one $1 two $2 three $3 ;
1867    one = 'ABCD';
1868    two = 'ABCD';
1869    three='ABCD';
1870    put (_all_) (=);
1871  run;

one=A two=AB three=ABC
NOTE: The data set WORK.TEST has 1 observations and 3 variables.
0 голосов
/ 10 апреля 2020

length является декларативным оператором и вводит переменную в вектор данных программы (PDV) с заданной вами длиной c. Когда в формуле используется необъявленная переменная, SAS назначает ей длину по умолчанию в зависимости от формулы или контекста использования.

Символьные переменные в SAS имеют фиксированную длину и дополняются пробелами справа. Вот почему trim(firstname) необходим, когда происходит || lastname конкатенация. Если это не так, то правильное заполнение firstname будет частью значения в операциях конкатенации, и может, вероятно, превысить длину переменной, получающей результат.

Там являются функциями конкатенации, которые могут упростить строковые операции

  • CAT, аналогично использованию оператора <var>||
  • CATT, аналогично использованию trim(<var>)||
  • CATS аналогично использованию trim(left(<var>))||
  • CATX аналогично использованию CATS с разделителем.
  • STRIP аналогично trim(left(<var>))

Ваш выражение может быть перекодировано как:

fullname = catx(' ', firstname, lastname);
0 голосов
/ 10 апреля 2020

Есть ли причина, по вашему мнению, должна? Можете ли вы увидеть конечные пробелы в фамилии, вы пробовали функцию length()?
Я могу ошибаться, но иногда, когда вы применяете функцию (особенно put) или импортируете данные, вы можете непреднамеренно сохранить начальные или конечные пробелы , Конечные пробелы являются загадкой, потому что вы не понимаете, что они есть, пока не попробуете сделать что-то еще с данными.
Оператор длины должен позволять вам хранить именно те данные, которые вы ему даете, при условии, что вы правильно используете числовую / символьную переменную, причем усечение происходит только в том случае, если значение длины слишком короткое. Я обнаружил, что функция compress() наиболее удобна для работы с пробелами и пунктуацией, особенно если вы объединяете переменные.

https://www.geeksforgeeks.org/sas-compress-function-with-examples/

Все лучший,

Фил

...