dsd和dlm =","有什么区别?在SAS?

时间:2015-11-20 22:29:29

标签: sas

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

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

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

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

2 个答案:

答案 0 :(得分: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格式标识符来保留引号言。

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

    infile (filename) dsd dlm=';';

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

请记住: DSD代表&#34;分隔符敏感数据&#34;因为它更专注于处理分隔符!

答案 1 :(得分:0)

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

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

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