DATA Step, Macro, Functions and more

Removing last character of a file.

Reply
New Contributor
Posts: 3

Removing last character of a file.

I am writing a program that gets IDs from a database then outputs them in files 900 at a time.  The IDs need to be surrounded by apostrophes and comma separated.  The list needs to start with an open parentheses and end with a closed parentheses in each of 3 files.  For example:

FileA.txt

('11111',

'22222',

'33333')

FileB.txt

('44444',

'55555',

'66666')

Here is my attempt at doing this, but I am a beginner and am sure this is not the best way.  And cannot figure out how to get rid of the final comma.

%Let taxlength=900;

data _null_;

file out1;

put @1 "(";

file out2;

put @1 "(";

file out3;

put @1 "(";

run;

data _null_;

set v_id;

if _n_ <= &taxlength then file out1 mod notitles ;

if 901 <= _n_ <= (&taxlength*2) then file out2 mod notitles ;

if 1801 <= _n_ <= (&taxlength*3) then file out3 mod notitles ;

vendorid=vendorid;

put @1 "'"

@2 vendorid 10.

@12 "'"

@13 ",";

run;

data _null_;

file out1 mod;

put @1 ")";

file out2 mod;

put @1 ")";

file out3 mod;

put @1 ")";

run;

Super User
Super User
Posts: 6,499

Re: Removing last character of a file.

You can use the FILEVAR option to generate the target filename.  You can also place your SET statement inside of an iterative DO loop to enforce the maximum file length.

I have coded this to place the commas at the beginning of the lines rather than the end of the lines as I find it much easier to read.

* Set the maximum into a macro variable to make it easier ;

%let max=15;

* Generate some dummy data to test ;

data dummy;

do _n_=1 to  3*&max - 10;

  vendorid=int(1e10*ranuni(0));

  output;

end;

run;

data _null_;

  filenum+1;

  filename=cats('out',filenum,'.txt');

  file dummy filevar=filename ;

  put '(' @ ;

  do _n_=1 to &max while (not eof);

     set dummy end=eof;

     if _N_>1 then put ',' @;

     put "'" vendorid +(-1) "'" ;

  end;

  put ')';

  if eof then stop;

run;


*** OUT1.TXT *** ;

('6112930255'

,'4017536623'

,'4614022222'

,'6636999275'

,'4235494129'

,'8338204831'

,'5500628452'

,'912050027'

,'4984888660'

,'3984991583'

,'1706911647'

,'4505465866'

,'7472367876'

,'2576759510'

,'6629737469'

)


New Contributor
Posts: 3

Re: Removing last character of a file.

Fantastic! Worked like a charm.  One other thing; how can I email each of these files?

Valued Guide
Posts: 765

Re: Removing last character of a file.

hi ... here's one idea with 30 observations to be written three files, 10 vendorids per file ...

* data set with 30 observations;

data v_id;

do _n_=1 to 30;

   vendorid = put(ceil(1e5*ranuni(999)),z5.);

   output;

end;

run;

data _null_;

* three file names;

array fn(3) $20 _temporary_ ('z:\one.txt' 'z:\two.txt' 'z:\thr.txt');

do i=1 to 3;

* filevar does not allow array variables;

  fname=fn(i);

  file x filevar=fname;

  put '(' @;

  do j=1 to 10;

    set v_id;

    if j lt 10 then put vendorid quote.;

    else put vendorid quote. ')';

  end;

end;

stop;

run;

Ask a Question
Discussion stats
  • 3 replies
  • 200 views
  • 0 likes
  • 3 in conversation