<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Conditional retaining values in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Conditional-retaining-values/m-p/749345#M235445</link>
    <description>It worked great, thanks a lot Ballard!!</description>
    <pubDate>Mon, 21 Jun 2021 17:45:22 GMT</pubDate>
    <dc:creator>japfvg</dc:creator>
    <dc:date>2021-06-21T17:45:22Z</dc:date>
    <item>
      <title>Conditional retaining values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Conditional-retaining-values/m-p/749320#M235439</link>
      <description>&lt;P&gt;Dear Experts:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Hope you're doing great, asking for your help again; let me explain you the data.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have a table like this:&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;string1&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;type&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;CUS5784John Smith5757&lt;/TD&gt;&lt;TD&gt;CUS&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ACC67858394857684393&lt;/TD&gt;&lt;TD&gt;ACC&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;PER57483948576849303&lt;/TD&gt;&lt;TD&gt;PER&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;CUS4893Paul Jones5784&lt;/TD&gt;&lt;TD&gt;CUS&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ACC5849605948304953&lt;/TD&gt;&lt;TD&gt;ACC&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;PER6758495060794843&lt;/TD&gt;&lt;TD&gt;PER&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;SHR7849586093837483&lt;/TD&gt;&lt;TD&gt;SHR&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The &lt;STRONG&gt;string1&lt;/STRONG&gt; field contains the data I need to extract, the first three letters is the code to identify what kind of record is about (&lt;STRONG&gt;type&lt;/STRONG&gt;), they can be CUS, ACC, PER, SHR and many others.&amp;nbsp; The CUS code will be the first of the group of records until another CUS code is found.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What I'm trying to do is to get the client name in the CUS record and write it in a new field (&lt;STRONG&gt;name&lt;/STRONG&gt;) for every record after but until a new CUS code is found, like this:&lt;/P&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;string1&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;type&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;name&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;CUS5784John Smith5757&lt;/TD&gt;&lt;TD&gt;CUS&lt;/TD&gt;&lt;TD&gt;John Smith&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ACC67858394857684393&lt;/TD&gt;&lt;TD&gt;ACC&lt;/TD&gt;&lt;TD&gt;John Smith&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;PER57483948576849303&lt;/TD&gt;&lt;TD&gt;PER&lt;/TD&gt;&lt;TD&gt;John Smith&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;CUS4893Paul Jones5784&lt;/TD&gt;&lt;TD&gt;CUS&lt;/TD&gt;&lt;TD&gt;Paul Jones&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;ACC5849605948304953&lt;/TD&gt;&lt;TD&gt;ACC&lt;/TD&gt;&lt;TD&gt;Paul Jones&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;PER6758495060794843&lt;/TD&gt;&lt;TD&gt;PER&lt;/TD&gt;&lt;TD&gt;Paul Jones&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;SHR7849586093837483&lt;/TD&gt;&lt;TD&gt;SHR&lt;/TD&gt;&lt;TD&gt;Paul Jones&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;And the code I already have is:&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let vfile = "c:\tmp\file_20210617.Out";

data 
	work.prueba ;
infile 
	&amp;amp;vfile. ;
input
	@1 string1 $char1638.;
    type = substr(string1,1,3);
    name = ifc( type = 'CUS', substr(string1,29,100), "");
run;


*Test1;
data work.prueba1 ;
do _n_ = 1 by 1 to (final) ;
set work.prueba end=final;
tag = ifc(type = 'CUS', name, "");
name = tag;
end;
run;


*Test2;
data work.prueba1 ;
set work.prueba ;
retain tag name ;
if type = 'CUS' then tag1 = tag ;
else tag1 = "" ;
run;


*Test3;
data work.prueba1 ;
set work.prueba ;
retain name ;
tag = name ;
run;&lt;BR /&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;But I don't know if retain is usefull here or I need another command.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any help would be greatly appreciated, thanks in advance.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Fernando&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 21 Jun 2021 17:04:47 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Conditional-retaining-values/m-p/749320#M235439</guid>
      <dc:creator>japfvg</dc:creator>
      <dc:date>2021-06-21T17:04:47Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional retaining values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Conditional-retaining-values/m-p/749340#M235442</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/310332"&gt;@japfvg&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Dear Experts:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hope you're doing great, asking for your help again; let me explain you the data.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I have a table like this:&lt;/P&gt;
&lt;TABLE border="1"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;string1&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;type&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;CUS5784John Smith5757&lt;/TD&gt;
&lt;TD&gt;CUS&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ACC67858394857684393&lt;/TD&gt;
&lt;TD&gt;ACC&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;PER57483948576849303&lt;/TD&gt;
&lt;TD&gt;PER&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;CUS4893Paul Jones5784&lt;/TD&gt;
&lt;TD&gt;CUS&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ACC5849605948304953&lt;/TD&gt;
&lt;TD&gt;ACC&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;PER6758495060794843&lt;/TD&gt;
&lt;TD&gt;PER&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;SHR7849586093837483&lt;/TD&gt;
&lt;TD&gt;SHR&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The &lt;STRONG&gt;string1&lt;/STRONG&gt; field contains the data I need to extract, the first three letters is the code to identify what kind of record is about (&lt;STRONG&gt;type&lt;/STRONG&gt;), they can be CUS, ACC, PER, SHR and many others.&amp;nbsp; The CUS code will be the first of the group of records until another CUS code is found.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;What I'm trying to do is to get the client name in the CUS record and write it in a new field (&lt;STRONG&gt;name&lt;/STRONG&gt;) for every record after but until a new CUS code is found, like this:&lt;/P&gt;
&lt;TABLE border="1"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;string1&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;type&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;name&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;CUS5784John Smith5757&lt;/TD&gt;
&lt;TD&gt;CUS&lt;/TD&gt;
&lt;TD&gt;John Smith&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ACC67858394857684393&lt;/TD&gt;
&lt;TD&gt;ACC&lt;/TD&gt;
&lt;TD&gt;John Smith&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;PER57483948576849303&lt;/TD&gt;
&lt;TD&gt;PER&lt;/TD&gt;
&lt;TD&gt;John Smith&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;CUS4893Paul Jones5784&lt;/TD&gt;
&lt;TD&gt;CUS&lt;/TD&gt;
&lt;TD&gt;Paul Jones&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ACC5849605948304953&lt;/TD&gt;
&lt;TD&gt;ACC&lt;/TD&gt;
&lt;TD&gt;Paul Jones&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;PER6758495060794843&lt;/TD&gt;
&lt;TD&gt;PER&lt;/TD&gt;
&lt;TD&gt;Paul Jones&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;SHR7849586093837483&lt;/TD&gt;
&lt;TD&gt;SHR&lt;/TD&gt;
&lt;TD&gt;Paul Jones&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And the code I already have is:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let vfile = "c:\tmp\file_20210617.Out";

data 
	work.prueba ;
infile 
	&amp;amp;vfile. ;
input
	@1 string1 $char1638.;
    type = substr(string1,1,3);
    name = ifc( type = 'CUS', substr(string1,29,100), "");
run;


*Test1;
data work.prueba1 ;
do _n_ = 1 by 1 to (final) ;
set work.prueba end=final;
tag = ifc(type = 'CUS', name, "");
name = tag;
end;
run;


*Test2;
data work.prueba1 ;
set work.prueba ;
retain tag name ;
if type = 'CUS' then tag1 = tag ;
else tag1 = "" ;
run;


*Test3;
data work.prueba1 ;
set work.prueba ;
retain name ;
tag = name ;
run;&lt;BR /&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But I don't know if retain is usefull here or I need another command.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Any help would be greatly appreciated, thanks in advance.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Fernando&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Please see:&lt;/P&gt;
&lt;PRE&gt;data have;
  infile datalines truncover;
  input string1 $ 1-22 ;
datalines;	
CUS5784John Smith5757
ACC67858394857684393
PER57483948576849303
CUS4893Paul Jones5784
ACC5849605948304953
PER6758495060794843
SHR7849586093837483	
;

data want;
   set have;
   type= substr(string1,1,3);
   length name $ 15;
   retain name ;
   if type='CUS' then name= substr(string1,8,10) ;
run;
&lt;/PRE&gt;
&lt;P&gt;I realize that we don't have your entire string1 value but this works with the provided example.&lt;/P&gt;
&lt;P&gt;Personally, I would hope there was some documentation about the source file and would have been able to read the values into proper variables from the beginning instead of having a single string variable.&lt;/P&gt;
&lt;P&gt;The flakiest part of this, and your example, is the code to get name from the middle of the string. Names are seldom all the same length and without additional information you end up with extra stuff.&lt;/P&gt;</description>
      <pubDate>Mon, 21 Jun 2021 17:35:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Conditional-retaining-values/m-p/749340#M235442</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2021-06-21T17:35:09Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional retaining values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Conditional-retaining-values/m-p/749341#M235443</link>
      <description>Hi Ballard&lt;BR /&gt;&lt;BR /&gt;We already have the full layout for every type (CUS has 3 fields, ACC has 5 fields and so on). My first problem is to get the client name for every record then I already have an idea of how to get the other fields... let me try with your code, thanks a lot.&lt;BR /&gt;&lt;BR /&gt;Fer</description>
      <pubDate>Mon, 21 Jun 2021 17:39:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Conditional-retaining-values/m-p/749341#M235443</guid>
      <dc:creator>japfvg</dc:creator>
      <dc:date>2021-06-21T17:39:54Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional retaining values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Conditional-retaining-values/m-p/749345#M235445</link>
      <description>It worked great, thanks a lot Ballard!!</description>
      <pubDate>Mon, 21 Jun 2021 17:45:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Conditional-retaining-values/m-p/749345#M235445</guid>
      <dc:creator>japfvg</dc:creator>
      <dc:date>2021-06-21T17:45:22Z</dc:date>
    </item>
  </channel>
</rss>

