|
实际工作中遇到的问题,现在有若干个ACCESS数据库(excel,epidata等同样原理),分别有若干个人录入,数据结构相同,如何将它们方便、快速的合并到一起呢?ACCESS的批量合并,网上有很多方法,如用vba实现,但比较麻烦,我用sas实现了合并,具体方法如下:
(1)把要合并的文件放到一个文件夹下(最好不要有子文件夹),写一个获取文件名的批处理,要不一个个改名,多麻烦。批处理如下(把下面代码放在txt记事本里保存,然后更改后缀名为bat,然后运行,按提示输入要合并的文件夹的路径,运行就可以得到这个文件夹下所有文件的文件名):
@echo off
if exist list.txt del list.txt /q
:input
cls
set input=:
set /p input= 输入要合并的文件所在的路径,回车确定后得到全部文件名:
set "input=%input:"=%"
:: 上面这句为判断%input%中是否存在引号,有则剔除。
if "%input%"==":" goto input
if not exist "%input%" goto input
for %%i in ("%input%") do if /i "%%~di"==%%i goto input
pushd %cd%
cd /d "%input%">nul 2>nul || exit
set cur_dir=%cd%
popd
for /f "delims=" %%i in ('dir /b /a-d /s "%input%"') do echo %%~nxi>>list.txt
if not exist list.txt goto no_file
start list.txt
exit
:no_file
cls
echo %cur_dir% 文件夹下没有单独的文件
pause
(2)构建一个excel文件,第一行为变量名,之后为具体值。第一列变量为文件名name(直接从刚才的批处理拷贝过来就行了),第二列为sas数据集名sas_name(对应于sas中的数据集名,可以用a1、a2等,用excel直接拖就行了);做好后把这个excel文件保存。
(3)启动sas系统,写下如下代码:
libname tests excel 'D:\表名文件.xls';
%include 'D:\yaowei\Macro.sas';
%macro test(name=,sas_name=);
PROC IMPORT OUT= WORK.&sas_name
DATATABLE= "test"
DBMS=ACCESS REPLACE;
DATABASE="D: \&name";
SCANMEMO=YES;
USEDATE=NO;
SCANTIME=YES;
RUN;
%mend;
%TableDrivenMacro(table=TESTS.'Sheet1$'n,
macro=test,
Parms=name table );
run;
(4) 运行以上代码,可以将数据全部读如到sas,如何合并就太简单了吧。
编辑:北京信诚IT保姆IT外包部 http:// www.xcitbm.com www.xcit.com.cn |