Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将字符串宏变量追加到数据集名称

将字符串宏变量追加到数据集名称
EN

Stack Overflow用户
提问于 2020-12-11 11:30:05
回答 3查看 673关注 0票数 0

我试图将一个字符串宏变量附加到SAS中的数据集名称中。我想要创建读取类似work.cps2020jan和work.cps2020feb的数据集。但这不是我想要的。我的代码:

代码语言:javascript
运行
AI代码解释
复制
%macro loop(values); 
 
     %let count=%sysfunc(countw(&values));

     %do i = 1 %to &count;                                           
      %let value=%qscan(&values,&i,%str(,));                                                                                          
      %put &value; 

    data work.cps2020&value.;
        set "A:\cpsb2020&value" ;

    mth = "&value.";

    keep
    PEMLR 
    mth
    ;

    run;

    %end;                                                                                                                      
                                                                                                                              
%mend;
                         
%loop(%str(jan,feb)); 

运行此代码将在日志中产生以下输出:

代码语言:javascript
运行
AI代码解释
复制
NOTE: There were 138697 observations read from the data set
      A:\cpsb2020jan.
NOTE: The data set WORK.CPS2020 has 138697 observations and 2 variables.
NOTE: The data set WORK.JAN has 138697 observations and 2 variables.
NOTE: DATA statement used (Total process time):
      real time           4.29 seconds
      cpu time            0.20 seconds


feb

NOTE: There were 139248 observations read from the data set
      A:\cpsb2020feb.
NOTE: The data set WORK.CPS2020 has 139248 observations and 2 variables.
NOTE: The data set WORK.FEB has 139248 observations and 2 variables.
NOTE: DATA statement used (Total process time):
      real time           4.44 seconds
      cpu time            0.15 seconds

我不明白为什么我的宏每个循环创建两个数据集,而不是每个循环创建一个数据集,名为work.cps2020jan和work.cps2020feb。如果我改变了&价值。to &I.SAS输出work.cps20201和work.cps20202。但这不是我想要的。

有什么见解吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-11 23:40:19

%QSCAN宏函数将用只对宏处理器系统可见的特殊不可见(不可打印)字符掩盖其结果。

所发生的是

代码语言:javascript
运行
AI代码解释
复制
data work.cps2020&value.;

被视为

代码语言:javascript
运行
AI代码解释
复制
data work.cps2020<mask-character><non-masked part of symbol value><mask-character>;  

在执行器处理过程中,它将不可打印的掩码字符视为非语法令牌分隔符,从而生成一个DATA语句,列出两个输出表。

代码语言:javascript
运行
AI代码解释
复制
data work.cps2020 jan;

可以使用%put _user_ (在日志中)观察到掩码字符在宏变量中的位置,或者可以从元数据视图(如SASHELP.VMACRODICTIONARY.MACRO )捕获实际的符号内容。

让我们简化宏,并添加一些日志记录和符号捕获

代码语言:javascript
运行
AI代码解释
复制
%macro loop(values); 
  %local count i;

  %let count=%sysfunc(countw(&values));
  %do i = 1 %to &count;
    %let value=%qscan(&values,&i,%str(,));

    %put _user_;                   %*--- log them masks;

    data x&i;                      %* --- symbol capture;
      set sashelp.vmacro;
      where name like '%VALUE%';
      value_hex = put (value,$HEX40.);
    run;

    %* --- do the step that creates two tables;

    data work.cps2020&value.;
      set sashelp.class;
    run;
  %end;
%mend;

options nomprint nosymbolgen nomlogic;

%loop(%str(jan,feb));

proc print data=x1 noobs style(data)=[fontsize=14pt fontfamily="Courier"];
  var value:;
run;

日志片段,这些小框是特殊的隐形掩蔽字符(我在图像捕获中显示它们,因为堆栈溢出/ html不会显示不可打印的字符)

相同的日志文本、复制和粘贴到Notepad2中将掩码字符显示为控制字符。

捕获的宏符号数据的Proc PRINT将公开十六进制掩蔽字符。

  • 06宏%引用start
  • 08宏%引用end
  • 01宏%str start
  • 02宏%str end
  • 1E蒙版逗号
票数 1
EN

Stack Overflow用户

发布于 2020-12-11 12:37:25

&value%qscan()引用的方式返回。使用%scan()代替。引用的宏变量有时会在以这种方式使用时引起问题的解决。最好只在需要时引用它们,例如在其中包含%签名的%put语句中。

票数 0
EN

Stack Overflow用户

发布于 2020-12-11 14:03:29

你不需要%qscan()。如果该值包含需要宏引用的任何字符,则无论如何它们在成员名称中使用都是无效的。所以使用%scan()代替。

但是,当在宏中使用时,即使在xxx&mvar中没有特殊字符的情况下,令牌程序有时也会错误地将像&mvar这样的东西看作两个令牌。您可以将正在生成的值分组以解决此问题。

例如,通过创建一个新的宏变量

代码语言:javascript
运行
AI代码解释
复制
%let dsn=cps2020&value.;
data work.&dsn. ;

或者使用%unquote()函数:

代码语言:javascript
运行
AI代码解释
复制
data %unquote(work.cps2020&value.);

或者使用名称文字:

代码语言:javascript
运行
AI代码解释
复制
data work."cps2020&value."n;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65257478

复制
相关文章
GWT 初体验
最近体验了一下 GWT(Google Web Toolkit),其实这个技术老早就有了,写 Java 代码,代码很像 AWT 或者 Swing,但是最后编译成一个 war 包,也就是说,没有啰嗦的 JavaScript、HTML 和模板语言,Java 从前到后通吃,常用的模块都被封装成组件了。虽说写起来代码还挺啰嗦的(写法上面居然不支持链式调用,这确实让我看不懂),而且也没有传统 Web 开发方式来得直观,但也算一种很有意思的开发方式,值得体验一下。网上有足够多的教程,要系统地学习,官方文档是最好的材料,非常详尽。而我的方式,则更具个人风格一点,比较+吐槽,这可不是教程。
四火
2022/07/18
1.1K0
GWT 初体验
在MySQL中查找重复记录
I want to pull out duplicate records in a MySQL Database. 我想在MySQL数据库中提取重复记录。 This can be done with: 这可以通过以下方式完成:
kirin
2021/04/30
4K0
Rdfind - 在Linux中查找重复文件
前段时间遇到一个问题,服务器下面一个文件夹下面的图片越来越多,由原来的5G,达到了现在的94G,其中这个文件夹下面有好多重复的图片,文件多了之后造成图片备份困难,图片迁移困难,浪费了大量的空间和IO。
kubernetes中文社区
2019/06/24
5.5K0
在 TS 中如何减少重复代码
相信有些读者已经听说过 DRY 原则,DRY 的全称是 —— Don’t Repeat Yourself ,是指编程过程中不写重复代码,将能够公共的部分抽象出来,封装成工具类或者用抽象类来抽象公共的东西,从而降低代码的耦合性,这样不仅提高代码的灵活性、健壮性以及可读性,也方便后期的维护。
阿宝哥
2020/05/06
2.4K0
uniq命令 – 去除文件中的重复行
uniq命令全称是“unique”,中文释义是“独特的,唯一的”。该命令的作用是用来去除文本文件中连续的重复行,中间不能夹杂其他文本行。去除了重复的,保留的都是唯一的,也就是独特的,唯一的了。
用户4988085
2021/07/24
3.1K0
使用uniq命令去除文件中的重复行
uniq命令全称是“unique”,中文释义是“独特的,唯一的”。该命令的作用是用来去除文本文件中连续的重复行,中间不能夹杂其他文本行。去除了重复的,保留的都是唯一的,也就是独特的,唯一的了。
用户7639835
2021/08/28
2.2K0
eclipse安装gwt插件,浏览器安装gwt插件,eclipse启动gwt自带的工程,并在浏览器上访问,eclipse导入gwt工程「建议收藏」
首先gwt插件,小编这里上传了eclipse和浏览器上的gwt插件:http://download.csdn.net/download/csdnliuxin123524/10255451
全栈程序员站长
2022/08/05
1.2K0
eclipse安装gwt插件,浏览器安装gwt插件,eclipse启动gwt自带的工程,并在浏览器上访问,eclipse导入gwt工程「建议收藏」
gwt之mvc4g
Mvc4g是一个简单的框架来实现的GWT应用程序的MVC模式。 主要思想 其主要思想是,以减轻开发人员的工作,以单独的视图从模型。该框架是一个XML文件,将允许开发人员告诉视图发射事件时要执行什么样
cloudskyme
2018/03/20
9180
gwt之mvc4g
快速在组合中查找重复和遗失的元素
? ? ? ? ? ? ? ?
望月从良
2018/09/29
4.5K0
快速在组合中查找重复和遗失的元素
在C#中如何List去除重复元素?
List中有两个一样的元素,想把两个都去除,用remove和removeall都不行,list中是对象,distinct好像也不太好使,还请各位帮忙解答一下。 代码片段如下: class Edge { public PointF start; public PointF end; }
全栈程序员站长
2022/11/16
2.6K0
LeetCode 609. 在系统中查找重复文件(哈希)
给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径。 一组重复的文件至少包括二个具有完全相同内容的文件。
Michael阿明
2020/07/13
1.5K0
编程实现删除数组中在重复数字
编写程序,在被调函数中删去一维数组中所有 相同的数,使之只剩一个,数组中的数已按由 小到大的顺序排列,被调函数返回删除后数组 中数据的个数。 例如: 原数组: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10 删除后: 2 3 4 5 6 7 8 9 10
用户7886150
2021/02/05
1.2K0
在Linux命令中tail的用法
linux 中的 tail 命令用途是按照要求将指定的文件的最后部分输出到标准设备,一般是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,如果该档案有更新,tail 会自动刷新,确保你看到最新的档案内容。 工作中经常用 tail 命令查看 PHP 错误日志,接口日志等.分享一下这个命令的用法! 一、tail 命令语法 tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ] 参数说明:
沈唁
2018/05/24
3.8K0
在AMD PetaLinux中添加命令pstree
命令pstree将相关进程以树状图显示,方便查看进程间的关系。由于调试需要,需要在Linux里使用命令pstree。但是PetaLinux产生的Linux映像,默认不带命令pstree。
hankfu
2023/10/16
3620
在 Linux 中管理日志操作命令
在 Linux 系统上管理日志文件可能非常容易,也可能非常痛苦。这完全取决于你所认为的日志管理是什么。
用户8989785
2021/09/09
1.1K0
linux nslookup命令安装,在CentOS中安装nslookup命令
域名查询工具nslookup并不是Win系统的专利,Linux系统中也可以使用,不过要安装,默认没有。
全栈程序员站长
2022/11/02
5.9K0
在 Laravel 中编写高级的 Artisan 命令
在上一篇教程中,学院君向大家介绍了什么是 Artisan 命令,系统内置的 Artisan 命令,以及如何编写一个简单的 Artisan 命令。我们完全可以将命令行看作与 Web 应用同等的控制台应用(实际上,Laravel 底层也是这么做的),它具备自己的路由、Kernel、输入、控制器(命令类)、输出。因此,在这篇教程中,我们将更进一步,一起来看下如何编写更加高级的 Artisan 命令,比如带输入参数、选项,以及能够与用户互动,输出图表/进度条的 Artisan 命令。
学院君
2021/01/08
8.4K0
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如 链表1->2->3->3->4->4->5 处理后为 1->2->5 public ListNode deleteDuplication(ListNode pHead) { ListNode cur = this.head; ListNode newHead = new ListNode(-1); ListNode tmp = newHead; while (cur != null){ if (cur.n
小雨的分享社区
2022/10/26
1.1K0
linux命令mysql启动,在linux中启动mysql服务的命令
用reboot命令重启linux服务器之后会导致mysql服务终止,也就是mysql服务没有启动。必须要重启mysql服务,否则启动jboss时会 报有关数据库mysql方面的错误。
全栈程序员站长
2022/08/27
20.2K0
linux命令mysql启动,在linux中启动mysql服务的命令
做技术,如何使自己在重复性业务中持续提升?
每个工作两年以上的技术人都应该想过,自己每天这样的这些业务代码,并没有什么技术含量,也没有什么拿得出手的项目,在公司的始终处于螺丝钉的地位,觉得自己目前做的一切虽然对公司有价值,但是似乎对自己并没有什么价值,难道一成不变的工作内容对我们真的没有任何价值么?
代码宇宙
2023/02/23
7290

相似问题

在If命令中重复If命令

26

GWT命令插入

118

在GWT中处理应用程序命令

12

在GWT命令模式中避免匿名内部类

10

在输出中重复命令

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档