SAS:如何循环工作文件以附加多个数据库表
SAS: How to loop though work file to append multiple database tables
我有一大堆数据库 table 需要添加到 SAS 上的合并 table 中。
- 此 table 列表会定期更改。
- 此列表中的某些 table 没有使用相同的列名。
- 列名不同的地方,列表会标明等价的名称。
此 table 列表从 csv 文件导入 SAS,类似于以下数据:
index
table_name
column_1_name
1
table_one_a
column1
2
table_one_b
columnOne
3
table_one_c
column_1
4
table_one_d
column_1_1
etc ........
etc.....
etc.....
我想附加此列表中的每个 table,然后通过引用上面列表中的 column_1_name 列更改适用的名称。
以下代码改编自 this link,说明了我希望 SAS 如何将上述列表中的 table 附加在一起。但是我不知道如何将上面的 table 列表及其列名转换为变量,以便它们可以在下图所示的宏中循环。
有没有一种方法可以将这个 table 列表转换成一个变量,然后我可以通过它的索引号循环它?
非常感谢任何帮助。
libname dbname ODBC DSN=databaseName;
%let table = table_one_a; run;
%let column_one = column1; run;
%MACRO append_tables;
%If index =1 %Then %Do;
data first_table;
set dbname.&table.;
&column1. = column1;
keep column1 column2 etc;
run;
%End;
%Else %Do;
data later_table;
set dbname.&table.;
&column1. = column1;
keep column1 column2 etc;
run;
proc append
BASE = first_table
DATA = later_table;
run;
%End;
%MEND;
为什么不使用循环而不是从列表中提取所有表名?另外,为什么不使用单个 SET
语句而不是 APPEND
过程?
*-- Create table list sample --*;
data csv_list;
length column_name .;
table_name = "table_one_a"; column_name = "Col1"; output;
table_name = "table_one_b"; column_name = "Column1"; output;
table_name = "table_one_c"; column_name = "Colonne1";output;
run;
*-- Create synthetic data for each table in table list --*
data temp.table_one_a;
Col1 = 1;
run;
data temp.table_one_b;
Column1 = 2;
run;
data temp.table_one_c;
Colonne1 = 3;
run;
libname temp "/home/kermit/Whosebug";
*-- Create macro tables with all table names + renaming --*
proc sql;
select cats(strip("temp."||table_name),"(rename=(",column_name,"=column1))") into :tables separated by " "
from csv_list;
quit;
*-- Append using set statement --*
data want;
set &tables.;
run;
*-- Tables macro is a concatenation of all table names in table list, separated by a space --*
%put &=tables;
TABLES=temp.table_one_a(rename=(Col1=column1)) temp.table_one_b(rename=(Column1=column1))
temp.table_one_c(rename=(Colonne1=column1))
*-- Result is the vertical combination of all tables + renaming in the tables macro --*
data _null_;
set want;
put id;
run;
column1
1 <-- table_one_a
2 <-- table_one_b
3 <-- table_one_c
我有一大堆数据库 table 需要添加到 SAS 上的合并 table 中。
- 此 table 列表会定期更改。
- 此列表中的某些 table 没有使用相同的列名。
- 列名不同的地方,列表会标明等价的名称。
此 table 列表从 csv 文件导入 SAS,类似于以下数据:
index | table_name | column_1_name |
---|---|---|
1 | table_one_a | column1 |
2 | table_one_b | columnOne |
3 | table_one_c | column_1 |
4 | table_one_d | column_1_1 |
etc ........ | etc..... | etc..... |
我想附加此列表中的每个 table,然后通过引用上面列表中的 column_1_name 列更改适用的名称。
以下代码改编自 this link,说明了我希望 SAS 如何将上述列表中的 table 附加在一起。但是我不知道如何将上面的 table 列表及其列名转换为变量,以便它们可以在下图所示的宏中循环。
有没有一种方法可以将这个 table 列表转换成一个变量,然后我可以通过它的索引号循环它?
非常感谢任何帮助。
libname dbname ODBC DSN=databaseName;
%let table = table_one_a; run;
%let column_one = column1; run;
%MACRO append_tables;
%If index =1 %Then %Do;
data first_table;
set dbname.&table.;
&column1. = column1;
keep column1 column2 etc;
run;
%End;
%Else %Do;
data later_table;
set dbname.&table.;
&column1. = column1;
keep column1 column2 etc;
run;
proc append
BASE = first_table
DATA = later_table;
run;
%End;
%MEND;
为什么不使用循环而不是从列表中提取所有表名?另外,为什么不使用单个 SET
语句而不是 APPEND
过程?
*-- Create table list sample --*;
data csv_list;
length column_name .;
table_name = "table_one_a"; column_name = "Col1"; output;
table_name = "table_one_b"; column_name = "Column1"; output;
table_name = "table_one_c"; column_name = "Colonne1";output;
run;
*-- Create synthetic data for each table in table list --*
data temp.table_one_a;
Col1 = 1;
run;
data temp.table_one_b;
Column1 = 2;
run;
data temp.table_one_c;
Colonne1 = 3;
run;
libname temp "/home/kermit/Whosebug";
*-- Create macro tables with all table names + renaming --*
proc sql;
select cats(strip("temp."||table_name),"(rename=(",column_name,"=column1))") into :tables separated by " "
from csv_list;
quit;
*-- Append using set statement --*
data want;
set &tables.;
run;
*-- Tables macro is a concatenation of all table names in table list, separated by a space --*
%put &=tables;
TABLES=temp.table_one_a(rename=(Col1=column1)) temp.table_one_b(rename=(Column1=column1))
temp.table_one_c(rename=(Colonne1=column1))
*-- Result is the vertical combination of all tables + renaming in the tables macro --*
data _null_;
set want;
put id;
run;
column1
1 <-- table_one_a
2 <-- table_one_b
3 <-- table_one_c