Using University edition SAS for a personal project. I'm hoping this is a simple mistake and not something that simply cannot be resolved. To reduce the problem to it's most basic core, what I need to be able to do is get the length of characters between each delimiter in an input file. The reason being is that I would like to generate an individual table for each variable. So there will be one table for the first variable, another for the second etc. The problem arises when I get beyond the first three variables because then the column start position can will be variable. So I don't know what particular column to set the @ condition to in my input statement. I need to use a variable to do this in the format @&numericvariableforlength. The problem I'm having is how to pass the variable value into the macro rather than the variable reference. For instance, as you can see from the code below I get exactly the result I want if I actually specify the value as 19. However, this isn't a constant and might change - atm I'm trying to get this to work with just the first line of data so FIRSTOBS and OBS will also be variable and I'll come across the same issue there. So I need to know what I need to do in order to pass in the value rather than the reference. As I have it written right now the value being stored in sslength is actually slength, not 19. So slength as a string is passed in as the parameter rather than the numeric value 19. How do I pass in 19? I was having a lot of trouble with sslength not being initialised when I was calling it at the end of the code with my other macro calls so I tried embedding it within the macro itself but that didn't help. Line of data I'm working with: AAA,19970102,2.43,2.45,2.42,2.43,62508 Code: LIBNAME ASX '/folders/myfolders';
%MACRO populate(data_name=, line_n=, start_pos=);
DATA ASX.&data_name;
INFILE '/folders/myfolders/ASXData/19970102.TXT' DSD FIRSTOBS = &line_n OBS = &line_n;
INPUT @&start_pos &data_name :$;
%put &start_pos;
RUN;
%MEND;
%MACRO getlength(col=, line_n=);
DATA _NULL_;
INFILE '/folders/myfolders/ASXData/19970102.TXT' FIRSTOBS = &line_n OBS = &line_n;
INPUT Raw :$ 1-50;
CALL SCAN(Raw, &col, position, slength, ',');
%LET sslength = slength;
*put sslength=slength;
%populate(data_name=High, line_n=1, start_pos=sslength);
/*This works:
%LET sslength = 19;
%populate(data_name=High, line_n=1, start_pos=&sslength);
*/
RUN;
%MEND;
%populate(data_name=stock, line_n=1, start_pos=1);
%populate(data_name=date, line_n=1, start_pos=5);
%getlength(col=3, line_n=1); Note: Edited to use text boxes. SOLUTION: I modified the following sections to get this to work. The solution was using symput as KurtBremser suggested. I'm now able to determine the point at which SAS identifies the start location (ie INPUT @&start_pos &data_name :$;) of the variable I want to input into my table. The advantage of this is that I am able to avoid SAS having to run through the entire line of data when I only want one variable. It had to be done at run time because the length of each variable can be different, and therefore the @ cursor will be different for every line. %MACRO getlength(col=, line_n=);
DATA _NULL_;
%GLOBAL var_length;
INFILE '/folders/myfolders/ASXData/19970102.TXT' FIRSTOBS = &line_n OBS = &line_n;
INPUT Raw :$ 1-50;
CALL SCAN(Raw, &col, position, input_length, ',');
input_length = position + input_length + 1;
CALL SYMPUT('var_length', input_length);
%put var_length=&var_length;
RUN;
%MEND; .... %populate(data_name=High, line_n=1, start_pos=&var_length);
... View more