SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 6769|回复: 13
打印 上一主题 下一主题

import多个csv文件并合并

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-5-4 14:53:30 | 只看该作者

import多个csv文件并合并

我有几十个csv datasets,名字均为G_I_xxxxxx,xxxxxx部分为数字,数字不连续。请问怎么能方便的导入所有的csv文件并合并成一个file?我现在每一个dataset用一个import语句:
PROC IMPORT OUT=G_I200611
            DATAFILE= "f:\G_I200611.csv"
            DBMS=CSV REPLACE;
     GETNAMES=yes;
     DATAROW=2;
     GUESSINGROWS=20;
RUN;

即使用macro的话还是要分别输入input和output file name,然后再合并,不知道有什么简便的方法可以一次实现?

谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-5-4 18:39:06 | 只看该作者

Re: import多个csv文件并合并

用宏来实现
我发消息你
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-5-8 16:48:43 | 只看该作者

Re: import多个csv文件并合并

to tianwild
我也遇到同样问题,可以发一份给我吗?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-5-8 22:05:22 | 只看该作者

Re: import多个csv文件并合并

难度是在读取文件夹下的文件名,参考如下(PS:也是以前某个大侠写的):
[code:1iuw7q91]data dn(keep=memname prefix postfix);
  rc=filename("mydir","&path");
  did=dopen("mydir");
  memcount=dnum(did);
  do i=1 to memcount;
    memname=dread(did,i);
  end;
  *--截取文件的前缀后后缀--;
  prefix=scan(memname,1,".");
  postfix=scan(memname,-1,".");
run;
[/code:1iuw7q91]
文件名获取了,再赋值宏变量,循环读取即可!其余的你写写看!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-5-9 08:43:11 | 只看该作者

Re: import多个csv文件并合并

小弟也遇到了同样的困窘,先谢过各位大吓. <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-5-9 11:53:05 | 只看该作者

Re: import多个csv文件并合并

To tianwild:
请问具体应该怎么用宏合并这些CSV文件呢?麻烦您指教 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-5-9 13:25:32 | 只看该作者

Re: import多个csv文件并合并

版本1: 鸣谢tianwild的赞助
[code:lo5954wi]%macro import1(path,out_ds);
        options nomprint nosymbolgen;
        %if %sysfunc(exist(&amp;out_ds)) %then
                %do;
                        proc datasets library=work nolist;
                                delete &amp;out_ds;
                        quit;
                %end;
        %let filrf=mydir;
        %let rc=%sysfunc(filename(filrf,&amp;path));
        %let did=%sysfunc(dopen(&amp;filrf));
        %do i=1 %to %sysfunc(dnum(&amp;did));
            %let memname=%sysfunc(dread(&amp;did,&amp;i));
                %if %upcase(%scan(&amp;memname,-1,'&#46;'))=CSV %then
                        %do;
                                proc import out=_temp datafile=&quot;&amp;path\&amp;memname&quot; dbms=csv replace;
                                        getnames=yes;
                                        datarow=2;
                                run;
                                data _temp;
                                        length In $200;
                                        set _temp;
                                        in=&quot;&amp;memname&quot;;
                                run;
                                proc datasets library=work nolist;
                                        append base=&amp;out_ds data=_temp;
                                quit;
                        %end;
        %end;
        %let rc=%sysfunc(dclose(&amp;did));
        proc datasets library=work nolist;
                delete _temp;
        quit;
%mend;
%import1(D&#58;\test,out1)[/code:lo5954wi]
版本2
[code:lo5954wi]%macro import2(path,var_list,out_ds);
        options nomprint nosymbolgen noxwait xmin;
        %macro inner(fname);
                data _temp;
                        length In $200;
                        infile &quot;&amp;path\&amp;fname&quot; firstobs=2 dlm=',';
                        input &amp;var_list;
                        in=&quot;&amp;fname&quot;;
                run;
                proc datasets library=work nolist;
                        append base=&amp;out_ds data=_temp;
                quit;
        %mend;
        %if %sysfunc(exist(&amp;out_ds)) %then
                %do;
                        proc datasets library=work nolist;
                                delete &amp;out_ds;
                        quit;
                %end;
        x &quot;cd &amp;path&quot;;
        x &quot;dir &#58;attrib *&#46;csv /o&#58;-d/b &gt;filename&#46;txt&quot;;
        data _null_;
                length filename $200;
                infile &quot;&amp;path\filename&#46;txt&quot; truncover;
                input filename $1-200;
                call execute('%inner('||trim(filename)||')');
        run;
        x &quot;del filename&#46;txt&quot;;
        proc datasets library=work nolist;
                delete _temp;
        quit;
%mend;
%import2(d&#58;\test,x y,out2)[/code:lo5954wi]
版本3
[code:lo5954wi]%macro import3(path,var_list,out_ds);
        options nomprint nosymbolgen noxwait xmin;
        x &quot;cd &amp;path&quot;;
        x &quot;dir &#58;attrib *&#46;csv /o&#58;-d/b &gt;filename&#46;txt&quot;;
        data &amp;out_ds;
                length filename $200;
                infile &quot;&amp;path\filename&#46;txt&quot; truncover;
                input filename $1-200;
                filename=cats(&quot;&amp;path\&quot;,filename);
                do until(last);
                        infile CSV filevar=filename end=last firstobs=2 dlm=',';
                        input &amp;var_list;
                        In=filename;
                        output;
                end;
        run;
        x &quot;del filename&#46;txt&quot;;
%mend;
%import3(d&#58;\test,x y,out3)[/code:lo5954wi]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2010-5-9 13:31:31 | 只看该作者

Re: import多个csv文件并合并

[quote=&quot;hopewell&quot;:38ue7tsf]版本1:...\test,x y,out3)[/quote:38ue7tsf]
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 大侠...
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2010-5-9 17:11:51 | 只看该作者

Re: import多个csv文件并合并

逛了论坛里的好多解法,整合了一个,当然是翻版各位大师的 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
[code:khqybusw]*--定义一个文件路径;
%let Path=%str(F&#58;\Myfile);

*--读取文件路径的文件名,并以Memname变量保存;
data Filena(keep = Memname Prefix);
        Rc  = filename(&quot;mydir&quot;,&quot;&amp;Path&quot;);
        Did = dopen(&quot;mydir&quot;);
        Memcount = dnum(did);
        do i = 1 to Memcount;
                Memname = dread(Did,i);
                Prefix = scan(Memname,1,&quot;&#46;&quot;);
                Postfix = scan(Memname,-1,&quot;&#46;&quot;);
                output;
        end;
run;

*--编写宏实现导入数据;
%macro Import_data(Prefix =);
        proc import datafile = &quot;&amp;Path&#46;\&amp;Prefix&#46;&#46;csv&quot;
        out = &amp;Prefix
        dbms = csv
        replace;
        getnames = yes;
run;
%mend;

*--调用宏,将文件导入;
data  Exe_Import;
        set Filena;
        call execute('%Import_data(prefix='||Prefix||')');
run;
[/code:khqybusw]
此程序可以不用对路径下的文件进行命名,直接用原来的文件名.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2010-5-9 17:15:11 | 只看该作者

Re: import多个csv文件并合并

<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 合并这些数据集hopewell大虾也可以提供几个Editions嘛.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-4 00:32 , Processed in 0.070997 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表