【问题标题】:what is the difference between dsd and dlm="," in SAS?SAS 中的 dsd 和 dlm="," 有什么区别?
【发布时间】:2015-11-20 22:29:29
【问题描述】:

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

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

(2): 如果你使用dsd,信息应该使用冒号吗?

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

【问题讨论】:

  • DLM 与 DSD 如何处理连续空格? DLM 与 DSD 如何处理带引号的字符字段?

标签: sas


【解决方案1】:

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

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

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

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 语句中使用 ~format 标识符来保留引号。

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

    infile (filename) dsd dlm=';';

我发现this documentation page 是最有启发性的。

记住:DSD 代表“分隔符敏感数据”,因为它更慎重地处理分隔符!

【讨论】:

    【解决方案2】:

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

    当实际值小于信息的宽度时,冒号修饰符会有所帮助,但它也有助于将指针移到分隔符之后,以便正确读取 NEXT 变量。这就是在使用带有 DSD infile 选项的格式化输入语句时的重要性。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2010-10-13
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      相关资源
      最近更新 更多