Поиск шаблона с символами и цифрами в SAS - PullRequest
0 голосов
/ 14 декабря 2018

Я проверяю качество данных и пытаюсь увидеть, сколько строк заполнено правильно.Поле должно содержать строку с одним символом, за которым следуют девять цифр, и имеет тип «Символ» длиной 10.

Пример.

  • A123456789
  • B123531490
  • C319861045

Я пытался использовать функцию PRXMATCH, но я не уверен, что использую правильный синтаксис.Я также пытался использовать PROC SQL с «Где не нравится» [AZ] [0-9] [0-9] »и т. Д. Мне кажется, что это не должно быть трудно выполнить, есть ли у кого-нибудь решение?

С уважением

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Вы можете создать REGEX, чтобы выполнить этот тест.Или просто создайте тест, используя обычные функции SAS.

data want ;
  set have ;
  flag1 = prxmatch('/^[A-Z][0-9]{9}$/',trim(name));
  test1 = 'A' <= name <= 'Z' ;
  test2 = not notdigit(trim(substr(name,2))) ;
  test3 = length(name)=10;
  flag2 = test1 and test2 and test3 ;
run;

Результаты:

Obs    name             flag1    test1    test2    test3    flag2

 1     A123456789590      0        1        1        0        0
 2     B123531490ABC      0        1        0        0        0
 3     C3198610           0        1        1        0        0
 4     A123456789         1        1        1        1        1
 5     B123531490         1        1        1        1        1
 6     C319861045         1        1        1        1        1
0 голосов
/ 14 декабря 2018

Встроенные функции SAS NOTALPHA и NOTDIGIT могут выполнять проверочные проверки.

invalid_flag = notalpha(substr(s,1,1)) || notdigit(s,2) ;

Вы можете выбрать недействительные записи напрямую с помощью оператора where или параметра

data invalid;
  set raw;
  where notalpha(substr(s,1,1)) || notdigit(s,2) ;  * statement;
run;

data invalid;
  set raw (where=(notalpha(substr(s,1,1)) || notdigit(s,2)));  * data set option;
run;

В семействах NOT* и ANY* есть несколько функций, и они могут обеспечить более высокую производительность, чем функции регулярных выражений общего назначения в семействе PRX*.

0 голосов
/ 14 декабря 2018

вы можете использовать prxparse и prxmatch, как показано ниже.

 data have;
 input name $20.;
 datalines;
 A123456789590
 B123531490ABC
 C3198610
 A123456789
B123531490
 C319861045
 ;


data want;
set have;
if _n_=1 then do; 
retain re; 
re = prxparse('/^[a-zA-z][0-9]{9}$/'); 
end;
if prxmatch(re,trim(name))  gt 0 then Flag ='Y';
else Flag ='N';
drop re;
run;

, если вы хотите, чтобы записи были только соответствуют критериям, используйте

 data want;
set have;
if _n_=1 then do; 
retain re; 
re = prxparse('/^[a-zA-z][0-9]{9}$/'); 
end;
if prxmatch(re,trim(name));
drop re;
run;
0 голосов
/ 14 декабря 2018

Вы можете использовать:

^[a-zA-z][0-9]{9}$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...