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

I have a dataset "all" that contains a column of the concatenation of all  products, and another dataset "product" that has each product name and its corresponding product number.

 

In the below code, I separated the product into each row per record in the data "all2", then join back with "product" table to get the product number.

 

I want to create a new column that has the concatenation of all product name follow by a colon and its corresponding product number. See below code and my desired output dataset. Is there a way to do that? Any helps and advices are greatly apperciated.

 

data all;
infile cards dlm= '|' missover truncover;
input all $1 - 150;
cards;
product01 | product02 | product03 | product04 | product05 | product06
product07 | product08 | product09 | product10 | product11 
product12 | product13 | product14 | product15 | product16 | product17 | product18
;
run;

data product;
input product $1-9 product_num;
cards;
product01	886
product02	479
product03	575
product04	146
product05	527
product06	194
product07	353
product08	810
product09	975
product10	233
product11	517
product12	792
product13	273
product14	861
product15	776
product16	126
product17	271
product18	157
;
run;
 
DATA ALL2;
LENGTH product_name $9;
RETAIN product_name;
DROP I;
SET all;
 
DO I=1 BY 1 WHILE (SCAN(all,I,'|')^='');
     product_name=compress(UPCASE(STRIP(SCAN(all,i,'|'))));
      OUTPUT;
END;
RUN;


PROC SQL;
CREATE TABLE all3 AS 
SELECT 
A.*,
B.*
from ALL2 as a full join product as b on a.product_name = compress(upcase(strip(b.product)))
;
quit;

My desire output is to create the "final" column which has the concatenation for all product name (follow by colon) and its corresponding product number (follow by '|' :

product_nameallproductproduct_numfinal
PRODUCT01product01 | product02 | product03 | product04 | product05 | product06product01886product01:886|product02:479 |product03:575|product04: 146|product05: 527|product06: 194
PRODUCT02product01 | product02 | product03 | product04 | product05 | product06product02479product01:886|product02:479 |product03:575|product04: 146|product05: 527|product06: 194
PRODUCT03product01 | product02 | product03 | product04 | product05 | product06product03575product01:886|product02:479 |product03:575|product04: 146|product05: 527|product06: 194
PRODUCT04product01 | product02 | product03 | product04 | product05 | product06product04146product01:886|product02:479 |product03:575|product04: 146|product05: 527|product06: 194
PRODUCT05product01 | product02 | product03 | product04 | product05 | product06product05527product01:886|product02:479 |product03:575|product04: 146|product05: 527|product06: 194
PRODUCT06product01 | product02 | product03 | product04 | product05 | product06product06194product01:886|product02:479 |product03:575|product04: 146|product05: 527|product06: 194
PRODUCT07product07 | product08 | product09 | product10 | product11product07353product07:353 | product08: 810 | product09: 975 | product10: 233 | product11: 517
PRODUCT08product07 | product08 | product09 | product10 | product11product08810product07:353 | product08: 810 | product09: 975 | product10: 233 | product11: 517
PRODUCT09product07 | product08 | product09 | product10 | product11product09975product07:353 | product08: 810 | product09: 975 | product10: 233 | product11: 517
PRODUCT10product07 | product08 | product09 | product10 | product11product10233product07:353 | product08: 810 | product09: 975 | product10: 233 | product11: 517
PRODUCT11product07 | product08 | product09 | product10 | product11product11517product07:353 | product08: 810 | product09: 975 | product10: 233 | product11: 517
PRODUCT12product12 | product13 | product14 | product15 | product16 | product17 | product18product12792product12:792|product13:273 |product14:861|product15: 776|product16:126 |product17:271 | product18: 157
PRODUCT13product12 | product13 | product14 | product15 | product16 | product17 | product18product13273product12:792|product13:273 |product14:861|product15: 776|product16:126 |product17:271 | product18: 157
PRODUCT14product12 | product13 | product14 | product15 | product16 | product17 | product18product14861product12:792|product13:273 |product14:861|product15: 776|product16:126 |product17:271 | product18: 157
PRODUCT15product12 | product13 | product14 | product15 | product16 | product17 | product18product15776product12:792|product13:273 |product14:861|product15: 776|product16:126 |product17:271 | product18: 157
PRODUCT16product12 | product13 | product14 | product15 | product16 | product17 | product18product16126product12:792|product13:273 |product14:861|product15: 776|product16:126 |product17:271 | product18: 157
PRODUCT17product12 | product13 | product14 | product15 | product16 | product17 | product18product17271product12:792|product13:273 |product14:861|product15: 776|product16:126 |product17:271 | product18: 157
PRODUCT18product12 | product13 | product14 | product15 | product16 | product17 | product18product18157product12:792|product13:273 |product14:861|product15: 776|product16:126 |product17:271 | product18: 157

 

1 ACCEPTED SOLUTION

Accepted Solutions
Tom
Super User Tom
Super User

So take your strings . 

data all;
  infile cards truncover;
  input all $150.;
cards;
product01 | product02 | product03 | product04 | product05 | product06
product07 | product08 | product09 | product10 | product11 
product12 | product13 | product14 | product15 | product16 | product17 | product18
;

And parse them into individual product names.  Let's call this dataset TALL. Let's add a unique identifier for each original observation.

data tall ;
  row+1;
  set all;
  length col 8 product $20;
  do col=1 to countw(all,'|');
    product=left(scan(all,col,'|'));
    output;
  end;
run;

image.png

Now match the PRODUCT with your other table to get the PRODUCT_NUM.

proc sql ;
create table new as 
  select a.*,b.product_num
  from tall a left join product b
    on a.product = b.product
  order by a.row,a.col
;
quit;

Now let's roll it back up into your new FINAL variable.

data want;
do until(last.row);
  set new ;
  by row ;
  length final $200 ;
  final=catx('|',final,catx(':',product,product_num));
end;
  drop col product product_num;
run;

image.png

 

 

 

View solution in original post

2 REPLIES 2
Tom
Super User Tom
Super User

So take your strings . 

data all;
  infile cards truncover;
  input all $150.;
cards;
product01 | product02 | product03 | product04 | product05 | product06
product07 | product08 | product09 | product10 | product11 
product12 | product13 | product14 | product15 | product16 | product17 | product18
;

And parse them into individual product names.  Let's call this dataset TALL. Let's add a unique identifier for each original observation.

data tall ;
  row+1;
  set all;
  length col 8 product $20;
  do col=1 to countw(all,'|');
    product=left(scan(all,col,'|'));
    output;
  end;
run;

image.png

Now match the PRODUCT with your other table to get the PRODUCT_NUM.

proc sql ;
create table new as 
  select a.*,b.product_num
  from tall a left join product b
    on a.product = b.product
  order by a.row,a.col
;
quit;

Now let's roll it back up into your new FINAL variable.

data want;
do until(last.row);
  set new ;
  by row ;
  length final $200 ;
  final=catx('|',final,catx(':',product,product_num));
end;
  drop col product product_num;
run;

image.png

 

 

 

LL5
Pyrite | Level 9 LL5
Pyrite | Level 9

Thanks Tom. How you used row+1 in the first data step and used it in the do until in the last data step is very clever.

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

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
  • 2 replies
  • 645 views
  • 2 likes
  • 2 in conversation