2015-09-24 34 views
0

我创建了一个格式,比如下面使用设置

data formatset; 
    input fmtname $ start $ end $ label $; 
    datalines; 
$test region1 region3 zone1 
$test region4 region5 zone2 
$test region6 region7 zone3 
; 
run; 

proc format library = work.formats 
    cntlin = work.formatset; 
run; 
quit; 

问题:我将有新的datalines数据与变量region。我想有一个新的属性zone其使用的格式$test.

data output; 
    input region $; 
    format zone $test.; 
    zone = region; 
    datalines; 
region1 
region2 
region3 
region4 
region5 
region6 
region7 
region8 
; 
run; 

enter image description here

回答

2

您可以使用您的格式,以确保有足够的字符都从你的zone可变的读取时需要指定的宽度。在第二个数据步骤中尝试format zone $test7.;

如果不指定宽度,SAS将默认为为格式定义的任何显示值的最大长度。在查找要显示的格式化值时,它将从格式化变量中只读取很多字符(在你的情况5中),如果这5个字符的格式中没有指定值,则它们逐字显示。

1

当您使用格式

随着format zone $test.;有什么不顺心,你内部长度$5(五个字符)创建的变量zone。为了证明,运行

proc contents data=output; 
run; 

随着zone = region;您在region的值赋给zone,然后将其截断为5个字符。该标签仅适用于打印或列出数据。在那个时间点,变量zone包含文本“区域”,其不在startend范围之一中,因此不被翻译。

你怎么可以使用格式来治愈它是当你把值赋给zone,写zone = put(region, $test);已经应用的格式

的一种方式,当治愈这种。

另一个是在给出格式之前明确指定区域的存储长度length zone $7;,或者像format zone $test.;一样同时执行两个区域,就像其他答案所暗示的那样。

为什么这种形式表现这样

当您使用cntlin,在proc format创建一个字符格式,它接收的长度最大标签长度,你的情况5个字符。该长度是存储该​​格式的变量的字符数。 你可以看到,如果你运行

proc format library = work.formats 
    cntlin = work.formatset; 
run; 

这是不符合逻辑的,的确,什么是坏:你不能在你的cntlin数据集中指定的长度改变这种状况。

如何治愈它在格式本身

只需指定其格式应显示长的8个字节的东西的任何值:

data formatset; 
    input fmtname $ start $ end $ label $; 
    datalines; 
$test region1 region3 zone1 
$test region4 region5 zone2 
$test region6 region7 zone3 
$test _dummy_ _dummy_ 1234567 
; 
run; 
1

的问题是,你没有定义变量在给它分配一个格式之前的区域。所以SAS使用分配格式的默认长度来定义变量区域。您可以通过将FORMAT语句移至赋值语句之后来解决此问题。然后SAS会假定ZONE的长度应该与REGION的长度相同。

但真正的解决方案是在使用它们或将格式附加到它们之前定义您的变量。

data output; 
    length region $8 zone $8 ; 
    input region; 
    zone = region; 
    format zone $test.; 
cards ; 
... 

如果您希望ZONE的值是$ TEST的值。格式将显示,然后在赋值语句中使用PUT()函数,而不是将格式附加到变量。

zone = put(region,$test.);