SAS数据集(看似)在设置其他数据时截断字符变量

SAS dataset (seemingly) truncating character variable when setting with another datas

提问人:Jim Nezamis 提问时间:3/7/2023 更新时间:3/7/2023 访问量:354

问:

我使用 PROC IMPORT 从 Excel 电子表格创建一个数据集,并获取字符变量的值“3 esoph - 2 cardia”(除其他外,但这是显示问题的那个)。然后,此数据集与本机 SAS 数据集连接。串联后,该值在屏幕和打印输出中显示为“3 esoph”。但串联后,值为十六进制$hex格式的“332065736F7068202D203220636172646961”。这将解码为“3 esoph - 2 cardia”(手动解码)。在两个数据集中,变量的长度均为 $18。

关于为什么“- 2 cardia”不显示的任何想法?即使数据以十六进制形式存在,这部分值是否真的丢失了?

我预计合并后的值是“3 esoph - 2 cardia”,而不是“3 esoph”。

我尝试了 PROC SQL 来执行转换 (UNION ALL),但得到了相同的结果。

SAS 串联 截断

评论

0赞 Tom 3/7/2023
VALUE 本身是否被截断?或者变量是否只是使用仅显示部分值的显示格式进行了定义?例如,如果一个变量中包含“123456789”,并且以 $5 格式显示,则在打印时看起来只有“12345”。

答:

1赞 Tom 3/7/2023 #1

从您的症状来看,您可能已经创建了一个变量,该变量的长度(LENGTH)比附加到它所显示的FORMAT更长。

对于普通字符变量,无需将任何格式附加到变量。因此,我建议从字符变量中删除格式,看看这是否使您的数据可用。

因此,例如,要连接数据集 ONE 和 TWO 以创建名为 WANT 的新数据集,可以使用如下数据步骤:

data want;
   set one two;
   format _character_ ;
run;

请注意,如果问题是变量的 LENGTH 太短,那么您将看到实际值的截断,而不仅仅是打印的结果,那么您可能需要在 SET 语句之前实际定义每个变量所需的长度。

data want;
  length id 8 string1 $30 text2 $100 ;
  set one two;
  format _character_ ;
run;