带有PROC FORMAT字符串的连字符

时间:2017-02-03 14:50:53

标签: string sas

我正在处理IC9代码,并且在代码和整数之间创建了一些映射:

proc format library = &formatlib;

    invalue category other = 0

        '410'-'410.99', '425.4'-'425.99' = 1

我有searchedsearched,但在格式化方面无法找到该范围实际工作原理的解释。

例如,取第一个范围。我假设SAS将'410'-'410.99'解释为“在包含范围[410,410.99]之间取每个值并将其转换为1。如果我在这个假设中错了,请纠正我。是否对待这些看似字符串是浮点小数,那么?我认为如果这些是格式化范围内所有代码的数字范围,则必须如此。

我是从R和Python的世界来到SAS,因此在SAS中使用引号字符的方式有时不清楚(比如在使用%let foo = bar时...不使用引号)。

1 个答案:

答案 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.7A410进行比较并发现更大,因为'4'='4','1'='1','0'='0','。' > '',更大。然后将410.7A410.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并用空格填充其余部分。