如何输出sas格式为proc格式语法?

时间:2013-12-16 12:02:13

标签: sas

我已经基于数据集创建了一种格式。现在我想将这种格式存储为值列表,作为我的sas程序中proc格式语法的一部分。有没有办法实现这个目标?

这样做的原因是我经常需要制作表格,将人们的国家背景分组为类似于大陆的群组。到目前为止,这已经通过使用国家代码作为关键变量与包含大陆变量的另一个数据集连接数据,然后在大陆变量上应用格式$ continents来完成。

我希望能够通过为使用国家/地区代码作为输入值的大陆制作格式来跳过此连接操作。我还希望将此格式存储在生成表而不是格式目录的语法文件中。由于世界上有很多国家,手动编写这种格式似乎容易出错。

1 个答案:

答案 0 :(得分:1)

这只是一个指南,尚未针对每种情况进行测试,例如:数字,字符&信息或多标签/图片格式。

/* Create a dummy format */
data dummyfmt ;
  retain fmtname 'DUMMY' type 'N' ;
  do i = 1 to 10 ;
    start = i ;
    label = repeat(byte(round(ranuni(0) * (122 - 97 + 1),1) + 96),10) ;
    if i = 10 then hlo = 'O' ;
    output ;
  end ;
run ;
proc format cntlin=dummyfmt ; run ;


/* Dump the format back out to a dataset */
proc format cntlout=dump library=work ;
  select dummy ;
run ;

proc print heading=H ; run ;

/* Write out to log... */
data _null_ ;
  set dump end=eof ;

  if _n_ = 1 then do ;
    put "proc format ;" ;
    if type = 'N' then put "  value " fmtname ;
    if type = 'C' then put "  value $" fmtname ;
    if type = 'I' then put "  invalue " fmtname ;
  end ;

  if hlo = 'O' then do ;
    if type in('N' 'C') then put "  other = '" label +(-1) "'" ;
    if type = 'I' then put " other = " label ;
  end ;
  else do ;
    if type in('N' 'C') then put "  " start " = '" label +(-1) "'" ;
    if type = 'I' then put "  " start " = " label ;
  end ;

  if eof then do ;
    put "  ;" ;
    put "run ;" ;
  end ;
run ;

您可能需要根据格式修改上述内容,尤其是涉及范围时。然后,SEXCL和EEXCL列将具有相关性。

/* Example output (from Log Window) */
proc format ;
  value DUMMY
  1  = 'bbbbbbbbbbb'
  2  = 'hhhhhhhhhhh'
  3  = 'ttttttttttt'
  4  = 'fffffffffff'
  5  = 'sssssssssss'
  6  = 'bbbbbbbbbbb'
  7  = 'aaaaaaaaaaa'
  8  = 'ppppppppppp'
  9  = 'eeeeeeeeeee'
  other = 'wwwwwwwwwww'
  ;
run ;