SAS数据步骤截断值

时间:2019-06-18 20:53:49

标签: merge sas set truncate

我有一系列数据集,这些数据集是通过使用pro sql语句从数据库中提取信息而创建的。我正在使用一个case语句创建一个“定义”种类的字段(度量)。然后,我使用数据步骤将这些不同的数据集合并在一起。但是,当数据集将它们组合(堆叠)时,该字段将被截断。

示例:以下“ Portfolio余额(带/环保充电关闭)”被截断为“ Portfolio余额(带/ Eco-Charge关闭)”或“申请量被截取为” Application Volume”。 / p>

下面是数据步骤语句。我尝试使用格式和长度来强制字符数,但它仍会截断值。我还创建了一个虚拟数据集“占位符”,其值包含50个字符,以尝试确保数据集中最长的值是在开始处,但这也无济于事。

DATA Data.COMBINED;

format measure  $45.;
SET
Data.PLACEHOLDERS 
Data.GSK
DATA.SSS
DATA.MF
DATA.SRT

;
RUN;

同样,如果我查看proc sql语句中返回的所有数据的返回结果,则会显示完整值。只有当我尝试将它们合并/堆叠到数据集中时,它们才会开始被截断。 有想法吗?

1 个答案:

答案 0 :(得分:3)

最好修改创建原始数据集的代码,以便它们以标准结构创建。

有两种方式可以将两个或多个数据集组合在一起,从而导致字符变量被截断(或截断)。

第一个是物理截断,因为在数据步骤中定义的变量比在一个源数据集中的定义要短。 SAS会在第一次看到变量时对其进行定义。因此,如果第一个数据集的MEASURE的长度为$ 20,则这就是定义的方式。解决该问题的方法与您的尝试类似,只是您应该使用LENGTHATTRIB语句来显式定义变量长度,而不是强迫SAS猜测您要如何基于以下内容定义变量变量首先出现在FORMAT语句中的事实。

第二个截断可能只是显示值的方式。如果您附加了一个宽度小于变量length的格式,那么即使输出中的值未真正被截断,它们也会在输出中被截断。当通过从外部数据库提取生成数据集时,这尤其可能发生,因为PROC SQL会自动分配与变量长度匹配的格式。对于字符变量,最简单的解决方案是从字符变量中删除那些格式。 SAS不需要他们知道如何显示值。

data combined;
  length var1 $40 var2 $20 ;
  set gks mf ;
  format _character_ ;
run;

实际上,PROC SQL非常擅长解决其长度问题。这样合并数据集可能会更容易。

proc sql;
create table combined as
  select * from gks
  union corr all
  select * from mf 
;
quit;