SAS从csv文件中提取字符串变量
已解决(根据尼尔·内曼的评论):SAS从csv文件中提取字符串变量,sas,Sas,已解决(根据尼尔·内曼的评论): &var1与var1不同 DATA local.trow; INFILE csvfile FIRSTOBS=&i OBS=&i; INPUT var1 $ var2 $ var3 $ var4 $; call symput('var1',var1); *Added line; call symput('var2',var2); *Added line; call symput('var3',var3);
&var1
与var1
不同
DATA local.trow;
INFILE csvfile FIRSTOBS=&i OBS=&i;
INPUT var1 $ var2 $ var3 $ var4 $;
call symput('var1',var1); *Added line;
call symput('var2',var2); *Added line;
call symput('var3',var3); *Added line;
call symput('var4',var4); *Added line;
RUN;
添加标有“*添加行”的行解决了问题
问题 免责声明:我对SAS非常陌生,并且已经为此代码中的问题挣扎了一段时间 在循环中,我试图从CSV文件导入字符串变量,然后将其中一个变量传递到远程服务器(
var1
),但遇到了一个问题。如果我包括%let var1='XXE'代码>在代码的顶部,排除从csv文件中提取变量的部分,远程执行工作正常,我得到了预期的输出
但是,如果我按原样运行代码,它似乎没有按预期处理字符串变量。例如,PROC PRINT
语句产生预期的输出(即,它显示4个变量),但标题没有正确显示——似乎var1
被完全跳过,而i
(值为1)和m
(值为2007)被显示。标题显示为“标题-1 2007”。日志在标题行附近显示以下错误:
WARNING: Apparent symbolic reference VAR1 not resolved.
远程提交也不起作用,但在突出显示&VAR1
时会产生以下错误:
ERROR: Syntax error while parsing WHERE clause.
ERROR 22-322: Syntax error, expecting one of the following: a quoted string,
a numeric constant, a datetime constant, a missing value.
我真的被这个错误弄糊涂了,因为PROC PRINT
语句能够打印变量(实际上,这些变量在视觉上看起来是字符串)。“带引号的字符串”是不同类型的变量吗
如果我在代码顶部显式声明var1
,或者在WHERE
子句中手动输入'XXE'
,则执行远程查询
可能是我处理文本文件不正确吗?看起来是这样的:
XXE XXA XXB XXC
XXM XXN XXI XXP
...
我的代码:
LIBNAME local 'C:\...\Pulled Data\New\';
FILENAME csvfile 'C:\...\Pulled Data\New\indexes.txt';
%macro getthedata(nrows,ystart,yend); *nrows is the number of rows in the text file;
%GLOBAL var1 var2 var3 var4;
%do i=1 %to &nrows;
%do m=&ystart %to ¥d;
DATA local.trow;
INFILE csvfile FIRSTOBS=&i OBS=&i;
INPUT var1 $ var2 $ var3 $ var4 $;
RUN;
PROC PRINT DATA = local.trow;
TITLE "Title - &i. &var1. &m";
var var1 var2 var3 var4;
RUN;
proc export data=local.trow
outfile="C:\...\Pulled Data\New\Indices_&i._&m..csv"
dbms=csv replace;
run;
signon username=_prompt_;
%syslput VAR1 = &var1;
rsubmit;
libname abc'server/sasdata';
data all2009;
set abc.file_2007:;
by index date time;
where index in (&VAR1) and time between '8:30:00't and '12:00:00't;
run;
endrsubmit;
%end;
%end;
%mend getthedata;
Options MPRINT;
%getthedata(1,2007,2007)
简短回答:
&var1与var1不同。添加下面描述的call symput()行,以将datastep值分配给宏变量值
DATA local.trow;
INFILE csvfile FIRSTOBS=&i OBS=&i;
INPUT var1 $ var2 $ var3 $ var4 $;
call symput('var1',var1);
call symput('var2',var2);
call symput('var3',var4);
call symput('var4',var4);
RUN;
其他注释
这似乎是一种奇怪的方式,但你说你是SAS的新手,所以也许我可以给你一些建议
在宏外部立即创建整个数据集
data local.trows;
length var1 var2 var3 var4 $3; *assuming vars really are only 3 chars;
infile csvfile; *this is not really a csv file, it looks space-delimited.;
*confusing to name it as such;
input var1 var2 var3 var4;
run;
我不明白为什么每行都有一个单独的输出csv文件?这真的是你需要的吗
拥有数据集后,宏可以执行以下操作:
%macro getthedata(mdataset)
data _null_;
set &mdataset; #add mdataset as a macro parameter;
/* automatically assigning nrows based on dataset; */
if last then call symput('nrows',_n_);
run;
%do i=1 to &nrows;
data _null_;
set &mdataset;
if &i=_n_ then do;
call symput('var1',var1);
call symput('var2',var2);
/*
etc... Doesn't seem like these really should be
globals since they change every iteration, and
don't seem needed outside of the macro?
*/
run;
/** now you have your vars set for the current iteration
and proceed with your connect code **/
似乎每次迭代都会覆盖此数据集。这就是你想做的吗?或者您是否在这个问题中遗漏了一些其他代码/宏变量
libname abc'server/sasdata';
data all2009;
set abc.file_2007:;
/*seems to be a random colon here ^ by the way*/
在哪里向这些宏变量输入值?我看到您将它们声明为全局的,所以它们是存在的。但您从未为它们设置值。我尝试将它们设置为4行,如下:DATA local.trow;infle csvfile FIRSTOBS=&i OBS=&i代码>但是&var1与var1不同。尝试在该行call symput('var1',var1'之后放置;调用symput('var2',var2)#等等,尼尔,你的评论让我可以回答这个问题。我将把它包括在问题的主体中。如果你想编辑你的答案,包括它,我会接受它作为答案。嗨,尼尔,你在我的问题下的评论实际上完全回答了我的问题。在回答您上面的几个问题时,我实际上省略了与VAR1
问题不直接相关的代码的重要部分。再次感谢@金先生:好的,我在回答中补充了这一点