让我总结一下我从这个网站得到的东西。 https://communities.sas.com/t5/General-SAS-Programming/Please-explain-DSD-and-DLM-differences/td-p/146773
(1):没有dsd,光标在读取下一个字段之前传递所有分隔符,而另一方面,使用dsd,光标只传递一个分隔符。
(2):如果你使用dsd,那么信息应该以某种方式使用冒号?
你知道两者之间有什么不同吗?非常感谢您的时间和关注。
答案 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
格式标识符来保留引号言。
值得注意的是,DSD
和DLM
也可以一起用来获取DSD
的行为,但是将默认的delmiiter从逗号更改为其他内容,例如分号(;)。例如:
infile (filename) dsd dlm=';';
我发现this documentation page是最有启发性的。
请记住: DSD
代表&#34;分隔符敏感数据&#34;因为它更专注于处理分隔符!
答案 1 :(得分:0)
输入语句在开始读取变量时看到分隔符时的实际问题。使用DSD
选项,它会将值设置为missing并将指针移过分隔符。如果没有DSD选项,它将在读取值之前跳过分隔符(或多个相邻分隔符)。您可以通过读取以分隔符开头的行来确认。
当实际值短于信息的宽度时,冒号修饰符会有所帮助,但它也有助于将指针PAST移动到分隔符,以便正确读取NEXT变量。当使用带有DSD
infile选项的格式化输入语句时,这就非常重要。
您可以通过使用INFORMAT
语句而不是在输入语句中列出信息来避免担心:修饰符。