BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
raveena
Obsidian | Level 7

Hi,

I have a field Id, if the id is length of provno less than 7 then delete..

data id;

set id;

cards;1

234-A35

1234567-d45

e453768

*123456789

*12345

;

run;

Please let me know.

Thanks

1 ACCEPTED SOLUTION

Accepted Solutions
art297
Opal | Level 21

Couldn't you just state it the way you did in your post?  i.e.,

data want;

  set id;

  if length(id) lt 7 then delete;

run;

View solution in original post

9 REPLIES 9
art297
Opal | Level 21

Couldn't you just state it the way you did in your post?  i.e.,

data want;

  set id;

  if length(id) lt 7 then delete;

run;

raveena
Obsidian | Level 7

Thanks Art..I need to clarify one more thing,If

DOES NOT BEGIN WITH A – Z OR 0 -9 OR THE LENGTH OF ID= 1 then delete.

Please let me know.

Thanks

art297
Opal | Level 21

A couple of questions:

A-Z or a-z?

1 is less than 7 or have you now changed the requirement of length to just be -1?

raveena
Obsidian | Level 7

Hi Art,

DO NOT SELECT A ID WHEN THE ID IS EMPTY OR DOES NOT BEGIN WITH A – Z OR 0 -9 OR THE LENGTH OF ID= 1.

This one for other requirement.

Thanks for your help !!

art297
Opal | Level 21

I think the following does what you want:

data id;

  infile cards truncover;

  informat id $10.;

  input id;

cards;

1234-A35

1234567-d45

   

e453768

1

A123

*123456789

*12345

;

run;

data want;

  set id;

  if not (('A'<=substr(id,1,1)<='Z') or

         ('0'<=substr(id,1,1)<='9'))

         or length(id) le 1 then delete;

run;

FriedEgg
SAS Employee

Here is solution with regex...

data foo;

infile cards truncover;

input @1 id $10.;

cards;

1234-A35

1234567-d45

e453768

1

A123

*123456789

*12345

;

run;

data bar;

set foo;

if prxmatch('/^[A-Z0-9]\S.+$/',id)>0;

run;

Will output

1234-A35

1234567-d4

A123

To add additional case of e453768 change expression to '/^[A-Z0-9]\S.+$/i'

MikeZdeb
Rhodochrosite | Level 12

Hi ... neat.

Not knowing much about PRX, I do understand the checking of the first character using

[A-Z0-9] but I don't understand how the string checks the length (criteria > 1).  This ID (with an embedded space

as the 2nd character) seems to be an acceptable ID based on the rules (start with A-Z, 0-9 and length > 1) but is not

picked up by the PRXMATCH string.  I guess that would happen with any acceptable 1st character followed by

one or more spaces plus more characters. 

Any way to modify to be a better check of variable length > 1 (could be useful)?  Thanks.

data foo;

infile cards truncover;

input @1 id $10.;

cards;

A 123

;

run;

data bar;

set foo;

if prxmatch('/^[A-Z0-9]\S.+$/',id)>0;

run;

FriedEgg
SAS Employee

I will explain the expression '/^[A-Z0-9]\S.+$/'

^[A-Z0-9] the start of the string is a letter A-Z or digit 0-9

\S the second character in the string is not a white space type

.+$ any character 1 or more times till end of string

because we are not striping the padding from the inbound variable this will match any string of more than 1 character even though it seems to imply an excepted length or three or more and not 2 or more.

In order to accept these cases with embeded spaces I would modify the expression to the following.

prxmatch('/^[A-Z0-9].{1,}$/',strip(id))

^[A-Z0-9] the start of the string is letter A-Z or digit 0-9

.{1,}$ followed by any character (except new line) 1 or more times

without the strip function on the inbound variable id the strings will be padded and match for length even though they may not be more that 1 character long.

data foo(where=(prxmatch('/^[A-Z0-9].{1,}$/',strip(id))));

infile cards truncover;

input @1 id $10.;

cards;

1234-A35

1234567-d45

e453768

1

A123

A 123

A     123

*123456789

*12345

;

run;

1234-A35

1234567-d4

A123

A 123

A     123

like previous to make the expression not case sensitive '/^[A-Z0-9].{1,}$/i' will capture the additional id e453768.

This expression is also the same as /^[A-Z0-9].+$/

+ means repeat previous statement 1 or more times

{n} means repeat exactly n times

{n,m} means repeat n to m times

{n,} means repeat n or more times

so + and {1,} are the same...

Ksharp
Super User

How about:

data id;
  infile cards truncover;
  informat id $10.;
  input id;
cards;
1234-A35
 
1234567-d45
   
e453768
1
A123
*123456789
*12345
;
run;

 

data want;
  set id;
if lengthn(id) in (0 1) or anyalnum(id) ne 1  then delete;
run;

Ksharp

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 9 replies
  • 1634 views
  • 0 likes
  • 5 in conversation