最明显的区别是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 标识符来保留引号。
值得注意的是DSD 和DLM 也可以一起使用来获得DSD 的行为,但是将默认分隔符从逗号更改为其他内容,例如分号 (;)。示例:
infile (filename) dsd dlm=';';
我发现this documentation page 是最有启发性的。
记住:DSD 代表“分隔符敏感数据”,因为它更慎重地处理分隔符!