我正在处理IC9代码,并且在代码和整数之间创建了一些映射:
proc format library = &formatlib;
invalue category other = 0
'410'-'410.99', '425.4'-'425.99' = 1
我有searched和searched,但在格式化方面无法找到该范围实际工作原理的解释。
例如,取第一个范围。我假设SAS将'410'-'410.99'
解释为“在包含范围[410,410.99]之间取每个值并将其转换为1
。如果我在这个假设中错了,请纠正我。是否对待这些看似字符串是浮点小数,那么?我认为如果这些是格式化范围内所有代码的数字范围,则必须如此。
我是从R和Python的世界来到SAS,因此在SAS中使用引号字符的方式有时不清楚(比如在使用%let foo = bar
时...不使用引号)。
答案 0 :(得分:2)
当SAS将字符串值与普通比较运算符进行比较时,它所做的是比较字符串中每个字符的字节表示,一次一个,直到达到差异。
所以你在这里看到的是输入字符串时,它将与'start'字符串进行比较,如果大于start,则与'end'字符串进行比较,如果小于end ,评估为1;如果不是列出的每一对,则评估为零。
重要的是,这意味着可能会出现一些无意义的结果 - 例如,请参阅以下测试的最后一行。
proc format;
invalue category other = 0
'410'-'410.99', '425.4'-'425.99' = 1
;
quit;
data test;
input @1 testval $6.;
category=input(testval,category.);
datalines;
425.23
425.45
425.40
410#
410.00
410.AA
410.7A
;;;;
run;
410.7A
与410
进行比较并发现更大,因为'4'='4','1'='1','0'='0','。' > '',更大。然后将410.7A
与410.99
进行比较并找到更少,因为'4'='4','1'='1','0'='0','7'< '9',更少。 A
与比较无关。但是在它上面的那一行上你看到它不在序列中,因为A
是ASCII 41x并且不小于'9'(ASCII 39x)。
请注意,所有SAS字符串都按空格填充其全长。这在字符串比较中很重要,因为空格是值最小的可打印字符(如果您考虑空间可打印)。因此,您可能与空间进行比较的任何字符都会更高 - 例如,第四行(410#
)为1,因为#
介于和
.
之间在ASCII表中!但是将其更改为/
并且失败了。同样,将其更改为byte(13)
(通过代码),然后失败 - 因为它 less 而不是空格(所以410^M
,^M
代表字节(13 ),小于开始(410
))。在信息和格式中,SAS会将格式/信息的开始/结束视为它所需的长度 - 因此,如果您正在读取6个长字符串,它将把它视为长度为6并用空格填充其余部分。