楼主: 新人2012
6993 19

[问答] 宏变量的间接引用问题,用了三个&&&,不能被解析。 [推广有奖]

  • 0关注
  • 16粉丝

硕士生

41%

还不是VIP/贵宾

-

威望
0
论坛币
660 个
通用积分
0.0085
学术水平
39 点
热心指数
31 点
信用等级
25 点
经验
2037 点
帖子
131
精华
1
在线时间
51 小时
注册时间
2012-12-9
最后登录
2016-1-2

楼主
新人2012 发表于 2012-12-9 14:29:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
部分代码摘录如下,其中提示不能解析宏变量&&&cnt&&filen&i.._&&filen&i._&j...,两个&&都能被解析。

/*file names match process,下面有误,不能识别cnt*/
    data tempt1_&&filen&i.._&&filen&i._&j..;
    set indexfile&&filen&i.._&&filen&i._&j.. end=flag;
        name=filen;
        %let n1_&&filen&i.._&&filen&i._&j..=scan(filen,1,".");
  
    %if flag=1 %then %let cnt&&filen&i.._&&filen&i._&j..=compress(scan(filen,2,"."),"0");;

   
   
    run;

    data tempt2_&&filen&i.._&&filen&i._&j..;
    length name $200. ;
       %do k=1 %to &&&cnt&&filen&i.._&&filen&i._&j...;
       %if &k.<10 %then name=trim(&&&n1_&&filen&i.._&&filen&i._&j...||".000"||left(&k.))||".pdf";
       %else name=trim(&&&n1_&&filen&i.._&&filen&i._&j...||".00"||left(&k.))||".pdf";;
       name=left(name);
       output;
       %end;
       run;;

   
        %end;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:compress Process length Names Press process names file

回帖推荐

wangfengxi 发表于11楼  查看完整内容

&的个数是level的2的n次方减一个

playmore 发表于8楼  查看完整内容

如果你在写批量导入TXT文件的宏,我的建议是首先导入文件夹内的文件列表,然后用宏内的%do循环依次读取列表中的路径和文件名,接着一个个的导入。也即把你的&&&&XXX之类的宏变量赋值放到一张文件列表里,然后一行行的读出,仅赋值到单一的宏变量中。这样的话也应该不会出现不读取空白文件的问题了。 上面我说的导入文件列表的宏可以用x命令写,你不明白的话研究个把小时就都明白了。

playmore 发表于3楼  查看完整内容

再加一个&试试,就是前面有四个&

沙发
新人2012 发表于 2012-12-9 14:30:41
%do k=1 %to &&&cnt&&filen&i.._&&filen&i._&j...;
这句不知有什么问题

藤椅
playmore 发表于 2012-12-9 19:12:16
新人2012 发表于 2012-12-9 14:30
%do k=1 %to &&&cnt&&filen&i.._&&filen&i._&j...;
这句不知有什么问题
再加一个&试试,就是前面有四个&
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
新人2012 + 1 + 1 + 1 我很赞同

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

板凳
新人2012 发表于 2012-12-9 22:55:30
playmore 发表于 2012-12-9 19:12
再加一个&试试,就是前面有四个&
非常感谢!试了一个午,什么;;,什么let,proc sql,symput定义宏变量,都试过了!
有币一定给你加币,但没币,只能给你空白的“感谢”,见谅

报纸
新人2012 发表于 2012-12-10 01:12:25
继续请教,
批量导入txt文件,如果碰到txt是空白文件,循环即中止,但如何转入继续读下一个txt

地板
新人2012 发表于 2012-12-10 01:53:31
归根到底还是&&&&cnt&&filen&i.._&&filen&i._&j变量的问题,碰到空白文件,不能形成数据集,
call symput("cnt&&filen&i.._&&filen&i._&j",cnt&&filen&i.._&&filen&i._&j) ,不能被赋值,循环中止。

有什么好办法跳过吗?

7
playmore 发表于 2012-12-10 09:19:48
新人2012 发表于 2012-12-9 22:55
非常感谢!试了一个午,什么;;,什么let,proc sql,symput定义宏变量,都试过了!
有币一定给你加币,但 ...
我论坛币多,不需要
你要是能评分就给我评个分吧,呵呵
另外这个加&管用吧?我也是过去试出来的,原理什么的不清楚
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

8
playmore 发表于 2012-12-10 09:23:37
新人2012 发表于 2012-12-10 01:53
归根到底还是&&&&cnt&&filen&i.._&&filen&i._&j变量的问题,碰到空白文件,不能形成数据集,
call symput( ...
如果你在写批量导入TXT文件的宏,我的建议是首先导入文件夹内的文件列表,然后用宏内的%do循环依次读取列表中的路径和文件名,接着一个个的导入。也即把你的&&&&XXX之类的宏变量赋值放到一张文件列表里,然后一行行的读出,仅赋值到单一的宏变量中。这样的话也应该不会出现不读取空白文件的问题了。

上面我说的导入文件列表的宏可以用x命令写,你不明白的话研究个把小时就都明白了。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
新人2012 + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

9
新人2012 发表于 2012-12-10 20:38:49
playmore 发表于 2012-12-10 09:23
如果你在写批量导入TXT文件的宏,我的建议是首先导入文件夹内的文件列表,然后用宏内的%do循环依次读取列 ...
你猜得八九不离十了。
是用X做的。
大文件夹下 符合一定特征的小文件夹的 小小文件夹中的 符合一定的特征的文件名,读出来进行匹配。使用的匹配数据集,以及匹配变量又是由宏自动生成的。

听起来就晕,做起来就更晕了,所有才会出现三四个&。大概这么解析的,我想:
比如:&&&&cnt&&filen&i
第一次扫描:两个&&变一个,&直接解析,结果是&&cnt&filen1  (比如某次循环中&i=1);
第二次扫描:......                                 ,结果是&cnt1  (比如某次循环中&filen1 =1);
第三次扫描:......                                 ,结果是1(比如某次循环中&cnt1 =1);
如果是:&&&cnt&&filen&i
过程按理来说应该是&&cnt&filen1-->&cnt1-->1,
但可能是,&&&cnt在第一次扫描中SAS想去解析单个的&“&cnt”,所以没有结果。

10
新人2012 发表于 2012-12-10 21:02:42
1.jpg
在网上找到一张图,应该是这么理解的。

f31fbe096b63f624b0bf60a18744ebf81b4ca3b6.jpg (30.54 KB)

f31fbe096b63f624b0bf60a18744ebf81b4ca3b6.jpg

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-8 16:10