【发布时间】:2017-08-21 19:24:11
【问题描述】:
我正在尝试导入一些具有多张工作表的文件。每张表中的变量名称从不同的行开始。我当前的代码允许我在一个数据集中获取所有工作表名称。我使用它将工作表名称存储在宏列表中,然后在 do 循环中使用 proc import 来导入每个工作表。我面临的问题是每张纸上的数据都从不同的行开始。我想知道是否有一种方法可以获取数据开始的每个工作表中的行号,以便我可以添加代码来指定导入宏中每个工作表的特定范围。
**********GETTING TAB NAMES****************
PROC SQL noprint;
CONNECT TO pcfiles (path = "[ENTER FILE PATH HERE]");
CREATE TABLE TABS_NAMES as
SELECT * from connection to pcfiles (PCFILES::SQLColumns "","","","");
DISCONNECT FROM pcfiles;
QUIT;
**********CLEANING TAB NAMES****************
Data Tab_names_1;
set TABS_NAMES;
Clean_tab_name = dequote(tranwrd(TABLE_NAME,"$",""));
if prxmatch ('/print/i',Table_name) > 0 then delete;
keep TABLE_CAT Clean_tab_name;
run;
Proc sort data = Tab_names_1 out = Tab_names_2 nodupkey;
by _all_;
run;
**********STORING TAB NAMES****************
Proc sql noprint;
select TABLE_CAT, Clean_tab_name
into :Path1-:Path999, :Tab_Name1-:Tab_name999
from Tab_names_2;
%let max=&sqlobs.;
quit;
***************IMPORTING FILES*********
%MACRO Import;
%do i=1 %to &max.;
Proc import
datafile = "&&Path&i.."
out = Raw_Data_&i..
dbms = excelcs
replace;
sheet = "&&Tab_Name&i..";
run;
%end;
%mend;
%Import;
【问题讨论】:
-
不幸的是,我不知道。 Excel 不是存储数据的好方法,但根据我的经验,这通常超出了程序员的控制范围。您可以指定导入数据的范围,请参阅 SAS 文档以获取使用 RANGE 选项的确切参考。
-
另外,您是否尝试过 libname 方法而不是 PROC IMPORT?为您的文件分配一个 libname 并使用 PROC COPY 一次导入所有工作表?