BookmarkSubscribeRSS Feed
laneylaners
Obsidian | Level 7

I have the following code:

 

Data work.data;
length A $40;
infile datalines dsd;
Input A $;
Datalines;
uncouple between ETTX & TTGX
TTPX and ETTX uncoupled
separation between DTTX and
ETTX and ETTX
;
Run;

data work.blah;
set work.data;
blah = find(A,"ETTX" );
blah2 = find(A,"ETTX",blah+1);
car1 = substr(A,blah,4);
car2 = substr(A,blah2,4);
run;

here is the output:

 

 

blah4.JPG

 

what is the easiest way to have SAS scan a 'list' of characters to search for?

 

for example, I not only want to search for ETTX, but DTTX, TTPX, TTGX, as well as others that aren't in this example.  is there a way for SAS to scan for the first instance of these characters and output that, and then scan again and output the second occurance? 

 

this is what i need the output to look like:

blah5.JPG

and you can see the order of car1 and car2 outputs have changed too.

3 REPLIES 3
ballardw
Super User

Is there a fixed known maximum number of matches that you will find?

This does the find and assign to the "car" variable. Changes would be to have the number of elements in the F array match the number of items you are going to search for, make sure the length of the F array elements is large enough (replace the 4) and have the number of items in the temporary list match the declared number.

The current comparsion is on equality, you may need to UPCASE the TEMP value, the F[j] value or both for the comparison.

 

data work.blah;
   set work.data;
   array f (5) $ 4 _temporary_ ('ETTX','TTGX','TTPX','DTTX','PPPQ');
   array result {10} $ 4 Car1-Car10;
   length temp $ 20.;
   Pos=0;
   Do i = 1 to (countw(A));
      temp = scan(a,i);
      Do j= 1 to dim(f);
         if f[j] = temp then do;
            pos = pos + 1;
            result[pos] = f[j];
         end;
      end;
   end;
   drop pos i j temp;
run;
Astounding
PROC Star

The easiest way is probably to switch the search around.  Take a word at a time from A, and see if it matches any of the values you are searching for ... something along these lines:

 

do i=1 to countw(A);

nextword = scan(A, i, ' ');

if nextword in ('ETTX', 'DTTX', etc.) then do;

 

Ksharp
Super User
Data have;
length A $40;
infile datalines dsd;
Input A $;
Datalines;
uncouple between ETTX & TTGX
TTPX and ETTX uncoupled
separation between DTTX and
ETTX and ETTX
;
Run;
data want;
 set have;
 pid=prxparse('/ETTX|TTGX|TTPX|DTTX/o');
 s=1;
 e=length(a);
 call prxnext(pid,s,e,a,p,l);
 do while(p>0);
  found=substr(a,p,l);
  output;
  call prxnext(pid,s,e,a,p,l);
 end;
 drop s e p l pid;
run;

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 3 replies
  • 833 views
  • 0 likes
  • 4 in conversation