2016-01-13 96 views
0

我的客户端使用SAS 9.3AIX(IBM Unix)服务器上运行。客户端界面是SAS企业指南5.1使用dmbs = xlsx过滤使用PROC IMPORT创建的SAS数据集

我遇到了这个令人困惑的问题:当PROC IMPORTdbms=xlsx结合使用时,根据字符变量的值(至少在我们寻找完全匹配时)过滤行似乎是不可能的。

随着.xls文件,以下导入工作得很好;行的预期子集写入myTable

proc import out = myTable(where=(myString EQ "ABC")) 
    datafile ="myfile.xls" 
    dbms = xls replace; 
run; 

然而,使用相同的数据但这次在的.xlsx文件,空数据集创建(其变量的权数和适当的色谱柱类型)。

proc import out = myTable(where=(myString EQ "ABC")) 
    datafile ="myfile.xlsx" 
    dbms = xlsx replace; 
run; 

而且,如果我们PROC IMPORT排除where,数据看似正确导入。但是,过滤是仍然不可能。举例来说,这将创建一个空数据集

data myFilteredTable; 
    set myTable; 
    where myString EQ "ABC"; 
run; 

下面的工作,但显然并不理想:

data myFilteredTable; 
    set myTable; 
    where myString LIKE "ABC%"; 
run; 

还要注意的是:

  • 使用compress或其他字符串函数不起作用
  • 使用数字列进行过滤适用于xlsxlsx文件。
  • 我最喜欢读取电子表格的方法是使用excel libnames,但目前在技术上这是不可能的。

我不知道这是不是一个已知的问题,目前为止我还找不到它的任何内容。任何帮助赞赏。

+0

听起来就像'myString'结尾处有一个额外的字符。你有没有检查过,以证实情况并非如此? ('把myString $ HEX。;'会是一个好开始) – Joe

+0

我选中了并且没有多余的字符存在。 –

+2

然后,我会再次检查,仔细检查这个十六进制转储。我可以看到一个导致WHERE在数据集选项中无法正常工作的XLSX导入引擎错误,但是我无法在SAS数据步骤中看到它以这种方式工作。那里有点可疑。也许它是与Unicode相关的或更类似的东西(更一般地说,与代码页有关),但是某些东西必须导致字符在ABC之后出现,如果“where mystring eq”ABC“'所有行都失败并且'mystring像” ABC%“'不。 – Joe

回答

0

听起来好像你的字符串在最后没有被compress拾取。尝试使用MyString上的countc函数来查看结尾是否存在任何额外的字符。然后,您可以确定在确定后要删除哪些字符,然后使用compress