SAS 冒号格式修饰符

Posted

技术标签:

【中文标题】SAS 冒号格式修饰符【英文标题】:SAS colon format modifier 【发布时间】:2020-04-23 19:51:41 【问题描述】:

灰色框中的数字代表什么?什么是理解冒号修饰符如何影响 sas 读取值的方式的简单方法?

【问题讨论】:

灰色框中的数字只是为了帮助您统计字符,它以 5 为单位计数字符,以帮助您在需要时找到长度/位置。 1、5、10、15、20、25、30、35 个字符。 啊,太简单了,谢谢。我把它读成 1,1,2,2,3,3,1,5,0 等等 【参考方案1】:

答案取决于未提供的信息。答案 B 是最佳选择,因为在 INPUT 语句中使用信息时应使用冒号修饰符,以防止使用格式化输入模式而不是列表输入模式。否则,格式化的输入可能会读取太多或太少的字符,并且还可能将光标留在错误的位置以读取下一个字段。

但是,如果您尝试从内联卡中读取该数据,则这两行都可以正常工作。那是因为行内数据线被填充到下一个 80 字节的倍数。

如果您将这些行放入一个文件中而行中没有任何尾随空格,则第二行将失败,因为最后一个字段没有 10 个字符可供读取。但是,如果您将 TRUNCOVER 选项(或 PAD)添加到 INFILE 语句,那么它将起作用。

自己试试吧。 TEST1 和 TEST3 工作。 TEST2 收到一张 LOST CARD 便条。

data test1;
  input name $ hired date9. age state $ salary comma10.;
  format hired date9.;
cards;
Donny 5MAR2008 25 FL $43,123.50
Margaret 20FEB2008 43 NC 65,150
;

options parmcards=test;
filename test temp ;
parmcards;
Donny 5MAR2008 25 FL $43,123.50
Margaret 20FEB2008 43 NC 65,150
;

data test2;
  infile test;
  input name $ hired date9. age state $ salary comma10.;
  format hired date9.;
run;

data test3;
  infile test truncover;
  input name $ hired date9. age state $ salary comma10.;
  format hired date9.;
run;

对于不同的数据,第一次格式化的输入也会引起麻烦。例如,如果日期值仅使用 2 位数字来表示年份,它就会把事情搞砸。因此它尝试将 FL 读取为年龄,然后将薪水的前 8 个字符读取为 STATE,并将空白读取为 SALARY。

data test1;
  input name $ hired date9. age state $ salary comma10.;
  format hired date9.;
cards;
Donny 5MAR08 25 FL $43,123.50
Margaret 20FEB2008 43 NC 65,150
;

结果:

Obs    name            hired    age    state       salary

 1     Donny       05MAR2008      .    $43,123.         .
 2     Margaret    20FEB2008     43    NC           65150

【讨论】:

谢谢!因此,如果我要使用 infile 导入,我可以使用 trunco​​ver 选项而不是使用冒号修饰符?如果我使用卡片功能,因为有填充,是否需要使用冒号修饰符? TRUNOVER 实际上只是处理读取粘贴到行尾的问题。但是行中间的格式化输入也可能导致问题,而这个小例子却没有。如果 HIRED 日期值的年份只有 2 位,则会造成麻烦。有时人们喜欢跳过实际定义其字符变量的长度,并在 INPUT 语句中使用一个信息来给 SAS 一个关于如何定义变量的提示。如果没有冒号,可以直接读取行中值之间的分隔符并使输入不同步。 我想我现在明白了,谢谢!我尝试使用带和不带冒号的信息(在使用卡片的测试数据上)并注意到 SAS 不知道在哪里将观察结果分隔到正确的列中,除非我在变量和信息之间添加了冒号。

以上是关于SAS 冒号格式修饰符的主要内容,如果未能解决你的问题,请参考以下文章

FINDC() 中的“k”修饰符在 SAS 中如何工作?

Java中的修饰符

山谈c中printf格式修饰符

vue组件双向绑定.sync修饰符的一个坑

正则表达式-修饰符

scanf 和 printf 格式修饰符