BookmarkSubscribeRSS Feed
RobertHuey
Calcite | Level 5

Hi all,

Is there a way for me to convert a dataset of 14 character variables and one numeric variable to all numeric variables without having to use input statements?  I would also like to keep the names of the variables too.  Is there a way to do this in an array?

Thanks in advance!

8 REPLIES 8
RW9
Diamond | Level 26 RW9
Diamond | Level 26

Not easily no.  You could write the data out to a temp file and then read it back in (note of course, that non-numeric will throw errors!):

data have;
  var1="123"; var2="456"; var3="678"; var4=678; output;
run;

data _null_;
  file "s:\temp\rob\temp.csv" dlm=",";
  set have;
  put var1 var2 var3 var4;
run;

data want;
  infile "s:\temp\rob\temp.csv" dlm=",";
  input var1 var2 var3 var4;
run;

If you combine this with sashelp.vcolumn in a macro or generated code you could do it for limitless unknown columns.

/* Write out file */

data _null_;

  set sashelp.vcolumn (where=(libname="WORK" and memname="HAVE")) end=last;

  if _n_=1 then call execute('data _null_; file "s:\temp\rob\temp.csv" dlm=","; set work.have; put ');

  call execute(' '||strip(name));

  if last then call execute(';run;');

run;

data _null_;

/* Read in file */

  set sashelp.vcolumn (where=(libname="WORK" and memname="HAVE")) end=last;

  if _n_=1 then call execute('data want; infile "s:\temp\rob\temp.csv" dlm=","; input ');

  call execute(' '||strip(name));

  if last then call execute(';run;');

run;

art297
Opal | Level 21

It would be cleaner using an input statement rather than +0, but the following should work:

data have;

  input (var1-var7) ($) var8 (var9-var14) ($);

  cards;

1 2 3 4 5 6 7 8 9 0 1 2 3 4

6 5 4 3 2 1 . 1 2 3 4 5 6 7

;

proc sql noprint;

  select catt(name,'=_',name),

         catt(name,'=_',name,'+0;')

    into :renames separated by ' ',

         :convert separated by ' '

      from dictionary.columns

        where libname='WORK' and

        memname='HAVE'

  ;

quit;

data want (drop=_:);

  set have (rename=(&renames.));

  &convert.

run;

RobertHuey
Calcite | Level 5

Thank you for your response!  I have a question about my memname.  I tried using a macro variable with an ampersand and it couldn't read it.

It looks as follows... 

memname='monthreport_&month'

Is there a way to deal with this?

Also, when I do memname='monthreport_april', it converts my character variable, month.  Is there a way for me to keep that variable as a character variable?

Thanks again!

art297
Opal | Level 21

In using dictionary.columns the values for both libname and memname MUST be in upper case. Additionally, macro variables won't resolve unless they are enclosed with DOUBLE quotes.

RobertHuey
Calcite | Level 5

Thanks again Arthur.  In doing so, it has a note that says that no rows were selected in the log.  Should that be a concern?....Actually it turns out that it didn't select my data.  None of the variables were converted when using double quotes and the macro variable.  Also, is there a way to keep one of my variables that is already stored as a character variable as a character variable?  Sorry for the confusion!

art297
Opal | Level 21

You would have to post more info, such as the actual file names and the code you ran (including how you set the macro variable &month. Since proc sql didn't select any rows, it wasn't able to obtain the necessary variable names. Should be easy to fix, but not without knowing what you actually have and tried.

RamKumar
Fluorite | Level 6

Hi Aruthur,

Your code sounds good. Could you please tell me the role of macro 'convert' in your code?

art297
Opal | Level 21

&renames and &convert aren't macros but, rather, macro variables used to add text to the program.

&renames simply adds an underscore to the beginning of each variable name.

&convert computes numeric variables with the original names using the form:

  var1=_var1+0;

I would have preferred to use the input function in creating that variable, but the OP didn't want to use input.

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

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
  • 8 replies
  • 1508 views
  • 8 likes
  • 4 in conversation