首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS中的dsd和dlm=",“有什么区别?

SAS中的dsd和dlm=",“有什么区别?
EN

Stack Overflow用户
提问于 2015-11-21 06:29:29
回答 2查看 5.1K关注 0票数 2

让我总结一下我从这个网站得到的东西。https://communities.sas.com/t5/General-SAS-Programming/Please-explain-DSD-and-DLM-differences/td-p/146773

(1):在没有dsd的情况下,光标在读取下一个字段之前会经过所有分隔符,而在有dsd的情况下,光标只会经过一个分隔符。

(2):如果你使用dsd,informat应该以某种方式使用冒号?

你知道这两者之间有什么区别吗?非常感谢您的时间和关注。

EN

回答 2

Stack Overflow用户

发布于 2015-11-21 16:57:53

最明显的区别是DSD如何处理连续的分隔符。从docs

当您指定DSD时,SAS 将两个连续的分隔符视为缺少值,而将从字符值中删除引号。

DLM=','的默认功能是将连续的逗号视为单个逗号,而DSD将在连续的逗号之间分配缺失值。下面是一个例子:

代码语言:javascript
复制
data work.dlm_test;
    infile datalines dlm=',';  /* using dlm */
    input var1 var2 var3;
    datalines; /* note how the consecutive commas are treated! */
1,2,3
1,,3
,2,3
;

data work.dsd_test;
    infile datalines dsd; /* using dsd */
    input var1 var2 var3;
    datalines;
1,2,3
1,,3
,2,3
;

proc print data=dlm_test;
    /* this will print something like:
    OBS | var1 | var2 | var3
   -----+------+------+------   Note only 2 observations b/c of 
     1  |  1   |  2   | 3       default FLOWOVER functionality.
     2  |  1   |  3   | 2  <--- Also, final '3' is ignored because there
                                is no variable to store it.
    */
run;

proc print data=dsd_test;
    /* this will print something like:
    OBS | var1 | var2 | var3
   -----+------+------+------
     1  |  1   |  2   | 3
     2  |  1   |  .   | 3  <-- note the missing value in var2
     3  |  .   |  2   | 3  <-- note the third observation, with missing val
    */
run;

此外,DSD将能够辨别引号内的逗号实际上不是分隔符,而是字符串的一部分。相反,如果您只使用DLM=',',那么它将忽略引号,并将每个逗号群集视为分隔符。

提示:默认情况下,DSD会删除字符串两边的引号,但是您可以通过在INPUT语句中使用~格式标识符来保留引号。

值得注意的是,DSDDLM也可以一起使用,以获得DSD的行为,但将默认分隔符从逗号更改为其他分隔符,如分号(;)。示例:

代码语言:javascript
复制
    infile (filename) dsd dlm=';';

我发现this documentation page是最有教育意义的。

记住: DSD代表“分隔符敏感的数据”,因为它在处理分隔符时更加谨慎!

票数 1
EN

Stack Overflow用户

发布于 2015-11-21 22:09:33

真正的问题是,当input语句在开始读取变量时看到分隔符时,它的行为如何。使用DSD选项,它会将值设置为missing,并将指针移过分隔符。如果没有DSD选项,它将在读取值之前跳过分隔符(或多个相邻的分隔符)。您可以通过阅读以分隔符开头的行来确认这一点。

当实际值小于informat的宽度时,冒号修饰符会有所帮助,但它也会帮助您将指针移过分隔符,以便正确读取下一个变量。这就是在将格式化的input语句与DSD infile选项一起使用时非常重要的原因。

通过使用INFORMAT语句而不是在input语句中列出信息,可以避免担心:修饰符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33837131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档