电子表格不是数据库。但是,我们中的许多人使用电子表格就好像它们是数据库一样,然后当电子表格布局不支持数据库样式严格的可预测行,列和变量类型时,我们就会挣扎 - 这是分析和报告所需的基本元素。如果您使用SAS从Microsoft Excel读取数据,当您需要的数据不是从单元格A1开始时,您可以做什么?
通过设计,SAS可以从电子表格中的任何单元格范围读取数据。在本文中,我将介绍如何在PROC IMPORT中使用RANGE语句来获取所需的数据。
对于SAS 9.4及更高版本,SAS建议使用DBMS = XLSX以获得最大的灵活性。它适用于所有操作系统,无需其他组件,如PC文件服务器。您的Excel文件必须采用Excel 2007或更高版本格式(XLSX)。你这样做需要SAS / ACCESS到PC文件的许可证。(刚刚学习?这些DBMS = XLSX技术也适用于SAS大学版。)
如果您的Excel数据不是从单元格A1(导入过程的默认起点)开始,那么您可以添加包含特定单元格的RANGE =值。最简单的方法是在Excel中使用命名范围来定义数据的确切边界。
如何添加命名范围
要在Excel中定义命名范围,请突出显示要包括的单元格范围,然后只需在“名称框”中键入范围的新名称:
然后保存Excel文件。
然后要导入SAS,请在RANGE =选项中指定范围名称:
proc importdatafile="/myprojects/myfile.xlsx"out=mydatareplace;range="myspecialrange";run;
对单元格区域使用Excel表示法
如果您不提前知道范围怎么办?您可以使用PROC IMPORT读取整个工作表,但结果将不包含所需的列标题和类型。考虑这样一张表:
这段代码会读它:
proc importdatafile="/myprojects/middle.xlsx"out=mid dbms=xlsxreplace;run;
但结果将包含许多空单元格,并且值将作为所有字符类型读取:
通过附加编码,您可以使用DATA步骤将此结果“修复”到另一个传递中。或者,如果您愿意为特定单元格区域添加带有Excel表示法的RANGE选项,则可以在第一遍中正确阅读:
proc importdatafile="/myprojects/middle.xlsx"out=mid dbms=xlsxreplace;range="Sheet1$E7:K17";run;
如何“发现”Excel文件的结构
您还可以使用LIBNAME XLSX从Excel中读取整个工作表,或者只是作为发现步骤在运行PROC IMPORT之前查看Excel文件包含的工作表。但是,LIBNAME XLSX不显示Excel命名范围。
在SAS for Windows系统上,您可以使用LIBNAME EXCEL(32位)或LIBNAME PCFILES(64位)来显示有关Excel文件的更多信息。
libnamed pcfiles path="c:myprojectsmiddle.xlsx";proc datasetslib=d;quit;/* always clear the libname, as it locks the file */libnamed clear;
请注意,DBMS = XLSX不支持我们在旧版DBMS = XLS(仅支持旧格式XLS文件)中看到的一些选项,例如STARTROW和NAMEROW。DBMS = XLSX支持GETNAMES(将工作表或范围的第一个记录视为变量名称)。