【问题标题】:SAS make dataset element into variableSAS将数据集元素变成变量
【发布时间】:2015-09-25 14:59:46
【问题描述】:

我有大量文件需要制作成 SAS 数据集。我有 SAS 数据集中所有文件的名称,例如:

doc_names
1. filename1
2. filename2
      .
      .
      .

所以我需要访问每个文件名,将其与文件路径连接起来,然后告诉 SAS 抓取该文件并从中制作数据集。

例如,如果我在 R 中执行此操作,它将如下所示:

path = 'path-to-files'
filenames = readLines('file-with-filenames.txt')
for (i in 1:length(filenames)) {
  current.file = filenames[i]
  full.file = paste0(path, current.file)
  data.set = read.csv(full.file)
}

基本上是 current.file = filenames[i] 部分,我在 SAS 中无法弄清楚。我需要能够从数据集的特定条目中创建一个宏变量,以便我可以将它与路径连接起来,然后告诉 SAS 它是一个文件名。

P.S.,我知道我可以创建一个具有文件完整路径的新数据集条目。这一切都很好,但这不是问题的核心。

感谢您的帮助!

【问题讨论】:

  • 我们可以假设您确实想要 X 个单独的数据集吗? SAS 可以将所有文件读入一个文件,并在一个步骤中识别它来自哪个文件 - 使用通配符和或 filevar/filename 选项。一般来说,最好有一个数据集并进一步使用 BY 处理。

标签: sas


【解决方案1】:

就我个人而言,我发现使用数据步骤为这种一次性编程任务生成代码要容易得多。因此,从文件中读取文件名,使用文件完整路径的名称以及要将 CSV 文件导入到的数据集名称创建变量。然后你就拥有了编写 PROC IMPORT 语句所需的所有信息。

filename code temp;
data filenames ;
  length path $100 filename $100 dsname $32 fullname $200 ;
  path = 'path-to-files' ;
  infile 'file-with-filenames.txt' truncover;
  input filename $100.;
  fullname=catx('/',path,filename);
  dsname = scan(filename,1,'.');
  file code ;
  put 'proc import datafile=' fullname :$quote. 'out=' dsname
    / '  dbms=dlm replace ; '
    / '  delimiter=","; '
    / 'run;'
  ;
run;
%include code / source2 ;

实际上,我不确定我是否会信任 PROC IMPORT 或 read.csv() 将一系列文件一致地转换为相同的结构。如果 CSV 文件都包含相同类型的信息,我会将它们全部读入一个数据集中。因此,如果您的 CSV 文件都有四个变量,那么此数据步骤会将它们全部读入一个数据集。

data all_data ;
  length path $100 filename $100 fullname $200 ;
  path = 'path-to-files' ;
  infile 'file-with-filenames.txt' truncover;
  input filename $100.;
  fullname=catx('/',path,filename);
  infile csv filevar=fullname dsd truncover end=eof ;
  * skip the header line;
  if not eof then input ;
  do while (not eof);
    length var1 var2 8 var3 $20 var4 8 ;
    informat var2 date9.;
    input var1-var4 ;
    output;
  end;
run;

【讨论】:

  • 这个话题需要有一个主问题,它几乎每隔一天就会出现:)
【解决方案2】:

假设您有一个宏,其中包含您在代码中阅读的内容 [例如%readin(file=) 包含 proc 导入或你有什么],你有很多选择。最简单的:

proc sql;
  select cats('%readin(file=',filename,')') 
  into :readinlist separated by ' '
  from yourdataset;
quit;

如果路径是恒定的,您可以将其添加到您的 readin 宏(硬编码)中,或者将其作为参数添加到您的 readin 宏中,或者将其添加到上面的串联中 - 任何最有意义的解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多