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

Bonsoir,

Je débutes avec SAS ET J'aimerais extraire une partie d'une chaine de caractères qui se présente dans un tableau comme suit
Col1 Col2           Col3
1       bismuth      WZ2801201714515390972268</cp_check_id><result>0</result><vart_id>01.269821<
2       Gandhi      <cp_reply><cp_id>TOPCPID</cd><cp_tr_id><result>21</result>credit_bal><end_val_daten
3       FILLON      01010CPUSSDGWID02024WZ2801201718562191813204050101485629752210010>      <result>15</result>801244522584256219181
4       PENELOPE 4WZ2801<result>5</result><2017<end_val_date>19/07/2025</end_val_date><end_inact_date>18/01/2038<

la longueur de la Col3 est variante, je veux donc extraire dans une autre table les Col1 Col2et le résultat de la Col3 qui est toujours délimité par <result>12</result>



Merci à tous pour vos réponses.

Cordialement

1 ACCEPTED SOLUTION

Accepted Solutions
art297
Opal | Level 21

There might be a more direct route, but the following will work:

 

data have;
  informat Col2 $8.;
  informat Col3 $char80.;
  input Col1 Col2 Col3 &;
  cards;
1 bismuth WZ2801201714515390972268 </ cp_check_id> <result> 0 </ result> <vart_id> 01.269821 <
2 Gandhi <cp_reply> <cp_id> TOPCPID </ cd> <cp_tr_id> <result> 21 </ result> credit_bal> <end_val_daten
3 FILLON 01010CPUSSDGWID02024WZ2801201718562191813204050101485629752210010> <result> 15 </ result> 801244522584256219181
4 PENELOPE 4WZ2801 <result> 5 </ result> <2017 <end_val_date> 19/07/2025 </ end_val_date> <end_inact_date> 18/01/2038 <
;

data want;
  set have;
  result=input(scan(substr(col3,find(col3,'<result>')+8),1,'<'),8.);
run;

HTH,

Art, CEO, AnalystFinder.com

 

View solution in original post

4 REPLIES 4
art297
Opal | Level 21

There might be a more direct route, but the following will work:

 

data have;
  informat Col2 $8.;
  informat Col3 $char80.;
  input Col1 Col2 Col3 &;
  cards;
1 bismuth WZ2801201714515390972268 </ cp_check_id> <result> 0 </ result> <vart_id> 01.269821 <
2 Gandhi <cp_reply> <cp_id> TOPCPID </ cd> <cp_tr_id> <result> 21 </ result> credit_bal> <end_val_daten
3 FILLON 01010CPUSSDGWID02024WZ2801201718562191813204050101485629752210010> <result> 15 </ result> 801244522584256219181
4 PENELOPE 4WZ2801 <result> 5 </ result> <2017 <end_val_date> 19/07/2025 </ end_val_date> <end_inact_date> 18/01/2038 <
;

data want;
  set have;
  result=input(scan(substr(col3,find(col3,'<result>')+8),1,'<'),8.);
run;

HTH,

Art, CEO, AnalystFinder.com

 

mansour_ibrahim
Obsidian | Level 7

Bonjour,

Je te propose une autre solution:

data have;
  informat Col2 $8.;
  informat Col3 $char80.;
  input Col1 Col2 Col3 &;
  cards;
1 bismuth WZ2801201714515390972268 </ cp_check_id> <result> 0 </ result> <vart_id> 01.269821 <
2 Gandhi <cp_reply> <cp_id> TOPCPID </ cd> <cp_tr_id> <result> 21 </ result> credit_bal> <end_val_daten
3 FILLON 01010CPUSSDGWID02024WZ2801201718562191813204050101485629752210010> <result> 15 </ result> 801244522584256219181
4 PENELOPE 4WZ2801 <result> 5</ result> <2017 <end_val_date> 19/07/2025 </ end_val_date> <end_inact_date> 18/01/2038 <
;

DATA test1(keep=col: resultat);
set have;
   if _N_=1 then RE = PRXPARSE("/\d+ ?\<\/ result\>/");            
   retain RE ;
   if PRXMATCH(RE,col3) > 0 then do;
   call PRXSUBSTR(RE,col3,START,LENGTH); 
   resultat = SUBSTRN(col3,START ,LENGTH);
   RX=PRXPARSE("s/\<\/ result\>/ /");
   CALL PRXCHANGE(RX,-1,resultat); 
   end;
run;

Cordialement

roll4life
Fluorite | Level 6
Thank you ! It works perfectly for me
PGStats
Opal | Level 21

Ou plus simplement :

 

data want;
if not prxId then prxId + prxParse("#<result>(.*)</result>#i");
set have;
if prxMatch(prxId, col3) then
    valeur = input(prxPosn(prxId, 1, col3), best.);
run;
PG

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
  • 4 replies
  • 2694 views
  • 3 likes
  • 4 in conversation