让我总结一下我从这个网站得到的东西。https://communities.sas.com/t5/General-SAS-Programming/Please-explain-DSD-and-DLM-differences/td-p/146773
(1):在没有dsd的情况下,光标在读取下一个字段之前会经过所有分隔符,而在有dsd的情况下,光标只会经过一个分隔符。
(2):如果你使用dsd,informat应该以某种方式使用冒号?
你知道这两者之间有什么区别吗?非常感谢您的时间和关注。
发布于 2015-11-21 16:57:53
最明显的区别是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语句中使用~格式标识符来保留引号。
值得注意的是,DSD和DLM也可以一起使用,以获得DSD的行为,但将默认分隔符从逗号更改为其他分隔符,如分号(;)。示例:
infile (filename) dsd dlm=';';我发现this documentation page是最有教育意义的。
记住: DSD代表“分隔符敏感的数据”,因为它在处理分隔符时更加谨慎!
发布于 2015-11-21 22:09:33
真正的问题是,当input语句在开始读取变量时看到分隔符时,它的行为如何。使用DSD选项,它会将值设置为missing,并将指针移过分隔符。如果没有DSD选项,它将在读取值之前跳过分隔符(或多个相邻的分隔符)。您可以通过阅读以分隔符开头的行来确认这一点。
当实际值小于informat的宽度时,冒号修饰符会有所帮助,但它也会帮助您将指针移过分隔符,以便正确读取下一个变量。这就是在将格式化的input语句与DSD infile选项一起使用时非常重要的原因。
通过使用INFORMAT语句而不是在input语句中列出信息,可以避免担心:修饰符。
https://stackoverflow.com/questions/33837131
复制相似问题