SAS中文论坛

标题: import多个csv文件并合并 [打印本页]

作者: shiyiming    时间: 2010-5-4 14:53
标题: 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,然后再合并,不知道有什么简便的方法可以一次实现?

谢谢!
作者: shiyiming    时间: 2010-5-4 18:39
标题: Re: import多个csv文件并合并
用宏来实现
我发消息你
作者: shiyiming    时间: 2010-5-8 16:48
标题: Re: import多个csv文件并合并
to tianwild
我也遇到同样问题,可以发一份给我吗?
作者: shiyiming    时间: 2010-5-8 22:05
标题: 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]
文件名获取了,再赋值宏变量,循环读取即可!其余的你写写看!
作者: shiyiming    时间: 2010-5-9 08:43
标题: Re: import多个csv文件并合并
小弟也遇到了同样的困窘,先谢过各位大吓. <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2010-5-9 11:53
标题: Re: import多个csv文件并合并
To tianwild:
请问具体应该怎么用宏合并这些CSV文件呢?麻烦您指教 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2010-5-9 13:25
标题: 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]
作者: shiyiming    时间: 2010-5-9 13: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 --> 大侠...
作者: shiyiming    时间: 2010-5-9 17:11
标题: 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]
此程序可以不用对路径下的文件进行命名,直接用原来的文件名.
作者: shiyiming    时间: 2010-5-9 17:15
标题: Re: import多个csv文件并合并
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 合并这些数据集hopewell大虾也可以提供几个Editions嘛.
作者: shiyiming    时间: 2010-5-10 15:20
标题: Re: import多个csv文件并合并
take it easy.
SAS is stupid on files handling.  let's use DOS.

x 'copy f:\G_I_*.csv f:\mybig.csv';
*your proc import for f:\mybig.csv;
作者: shiyiming    时间: 2010-5-10 15:30
标题: Re: import多个csv文件并合并
<!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2010-5-11 12:44
标题: Re: import多个csv文件并合并
<!-- s:!: --><img src="{SMILIES_PATH}/icon_exclaim.gif" alt=":!:" title="Exclamation" /><!-- s:!: -->  <!-- s:!: --><img src="{SMILIES_PATH}/icon_exclaim.gif" alt=":!:" title="Exclamation" /><!-- s:!: -->
作者: shiyiming    时间: 2012-7-22 21:41
标题: Re: import多个csv文件并合并
Mark




欢迎光临 SAS中文论坛 (http://www.mysas.net/forum/) Powered by Discuz! X3.2