【问题标题】:Reading multiple csv files into SAS datasets将多个 csv 文件读入 SAS 数据集
【发布时间】:2011-12-19 22:26:09
【问题描述】:

我有以下 csv 文件,我需要将它们读入 SAS 数据集。 另外,我需要分配列名。 另外,我需要列是数字的,但有些列同时具有数字和字符值。

文件夹aa:abc1.csv,abc2.csv,abc3.csv,...... 文件夹 bb:abc1.csv、abc2.csv、abc3.csv、...... 文件夹抄送:abc1.csv、abc2.csv、abc3.csv、......

【问题讨论】:

  • 你有n个包含n个csv文件的文件夹吗?您使用的是 Unix、Windows 还是大型机?
  • 是的,我有 n 个文件夹,其中包含 n 个 csv 文件。我在 Windows 上。我是 SAS 的新手,真的被这个问题困扰。非常感谢!
  • “需要列是数字”是什么意思?字符值不能存储为数字。
  • 我需要将字符值视为缺失,因此该列可能是数字。非常感谢!

标签: csv macros sas


【解决方案1】:

你也可以按照下面的方式来做。

  1. 将所有文件保存在一个文件夹中。
  2. 在一个只有一列的 csv 文件中命名所有这些。
  3. 将带有文件名的文件 (csv) 导入 SAS。
  4. 创建一个宏以使用“into”子句保留其名称。

    proc sql;
    select name_list into :name separated by '*' from work.name;
    %let count2 = &sqlobs;
    quit;
    
  5. 创建一个如下所示的宏。

    %macro yy;
    %do i = 1 %to &count2;
    %let j = %scan(&name,&i,*);
    proc import out = &j datafile="folderwhereallcsvfilesarekept\&j..csv"
    dbms=csv replace;
    getnames = yes;
    run; 
    %end;
    %mend;
    

【讨论】:

    【解决方案2】:

    这不是一个完整的答案,但可以帮助您入门。您必须添加一个外部循环来遍历要从中获取文件的不同目录。

    /*List the files in a directory for use in a data step. This is written for Windows. Other operating systems will be slightly different. */
    filename fnames pipe 'dir c:\temp\* /b';
    
    /* Create a data set with one observation for each file name */
    data fnames;
        infile fnames pad missover;
        input @1 filename $255.;
        n=_n_;
    run;
    
    /* Store the number of files in a macro variable "num" */
    proc sql noprint; select count(filename) into :num; quit;
    
    /* Create a macro to iterate over the filenames, read them in, and append to a data set. */
    %macro doit;
        %do i=1 %to #
    
            proc sql noprint;
                select filename into :filename from fnames where n=&i;
            quit;
    
            data ds;
                infile &filename;
                input ...list of variable names...;
                ...other statements...;
            run;
    
            proc append data=ds base=final; run;
        %end;
    %mend;
    
    %doit;
    

    【讨论】:

    • 非常感谢,Itzy!但我仍在试图弄清楚。对 SAS 来说真的很新鲜。
    猜你喜欢
    • 2011-12-24
    • 2021-08-16
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    相关资源
    最近更新 更多