【问题标题】:Read specific data from multiple text files in one directory in SAS从 SAS 一个目录中的多个文本文件中读取特定数据
【发布时间】:2018-02-24 00:53:23
【问题描述】:

*** 已解决。最后附上答案。谢谢大家的帮助!

感谢您阅读本文。我正在研究我以前的同事留下的一段代码,并试图从中找出一些意义。

目的是从一个目录中的多个文本文件中读取特定数据(例如:第 1 行和第 17 列的值,以及第 12 行和第 33 列的值)并将数据放入 SAS 表中。

%macro cycle_through_server_records;

%local i next_file;
%do i=1 %to %sysfunc(countw(&SERVER_FILE)) ;
%let next_file = %scan(&SERVER_FILE, &i);
%let Ext =.TXT ;

DATA TEST.LIC_SERVER;
INFILE 'C:\Users\Name\Desktop\TEST\&next_file&..TXT'   FIRSTOBS=1 OBS=12 
MISSOVER;
INPUT
@17 DATA_FILE $11.///////////
@33 SERVER_RECORDS_COUNTS $9. ;
RUN;

PROC APPEND BASE=TEST.SERVER_FILE DATA=TEST.LIC_SERVER FORCE;
RUN;

%END;
%MEND cycle_through_server_records;

%cycle_through_server_records;

宏变量是通过 SQL 查询从元数据文件中设置的。

proc sql noprint;
select State 
     , compare_Date
     , Data_Source
     , Source_Date
     , file_name
     , Source_file_date
  into :total_state separated by ' ' 
     , :compare_date separated by ' '
     , :Data_Src separated by ' ' 
     , :Source_Cd_Date separated by ' '
     , :Server_file separated by ' '
     , :Src_file_dt separated by ' ' 
  from AUTO_SDS.config 
; 
quit;

每次我在 SAS 中运行它时,我都会收到此错误消息“错误:物理文件不存在,C:\Users\Name\Desktop\TEST\&next_file&..TXT”。不知道文件路径有什么问题?

此外,由于错误消息,代码仍然能够运行。但是只从一个文本文件中返回了 9 个重复的行(目录中有多个文本文件)。我被困住了。有人可以帮我解决这个问题吗?

提前感谢您的时间和帮助!

按照建议,我在此处发布了我运行的代码和日志文件。谢谢!

%LET Path_files = C:\Users\name\Desktop\TEST;

%macro cycle_through_server_records;
%local i next_file;
%do i=1 %to %sysfunc(countw(&SERVER_FILE)) ;
%let next_file = %scan(&SERVER_FILE, &i);

DATA TEST.LIC_SERVER;
INFILE "&Path_files\&next_file&..TXT"   FIRSTOBS=1 OBS=12 MISSOVER;
INPUT
@17 DATA_FILE $11.///////////
@33 SERVER_RECORDS_COUNTS $9. ;
RUN;

PROC APPEND BASE=TEST.SERVER_FILE DATA=TEST.LIC_SERVER FORCE;
RUN;

%END;
%MEND cycle_through_server_records;

%cycle_through_server_records;

PROC SORT DATA=TEST.SERVER_FILE NODUP;
BY DATA_FILE;
RUN;

该目录下有22个文件,文件名均采用以下格式“State_201708”,均为Text Document (.txt)。

输出数据集 TEST.SERVER_FILE 只有一个文件的数据。

SAS 日志:

目录中的 8 个文件有 8 条错误消息(我不知道为什么是 8 条,而不是 21 条。因为只有一个文件的数据被成功捕获)。错误消息如下所示:

错误:物理文件不存在,C:\Users\name\Desktop\TEST\State_201708.TXT。

感谢您的帮助!

*** 解决方案 在您的所有 cmets 和同事的帮助下,我们找到了为什么它仅适用于目录中的某些文件而不是全部的原因。正如 Tom 在下面指出的那样,它正在从变量 SERVER_FILE 中检索信息(来自此处未使用的 CONFIG 表)。

我们为使其工作所做的工作:我们在宏之前添加了一个额外的步骤,用于从目录中读取所有文件名并将它们放入 SAS 表中。然后将该列变成一个变量。用新的变量名替换 SERVER_FILE。现在它起作用了!

【问题讨论】:

  • 你在哪里设置宏变量SERVER_FILE?
  • 这是一个非常好的问题!我在同事的代码中搜索宏变量 SERVER_FILE。它只在不同的代码部分显示一次。我将在下面附上那部分代码。谢谢!
  • 如果格式是大量的,我很抱歉。我不确定如何在评论部分输入代码。该代码显示 SERVER_FILE 变量是从 AUTO_SDS.config 表中设置的,这在我想要做的事情中是不需要的。代码:proc sql noprint;将 State ,compare_Date, Data_Source, Source_Date, file_name, Source_file_date 选择为 :total_state 分隔 ' ' :compare_date 分隔 ' ' :Data_Src 分隔 ' ' , :Source_Cd_Date 分隔 ' ', :Server_file 分隔 ' ', :Src_file_dt由 ' ' 与 AUTO_SDS.config 分隔;退出;
  • 我将您评论中的代码发布到问题中。
  • 您确定它所抱怨的文件存在于运行 SAS 的机器上吗?您确定运行 SAS 代码的用户 ID 有权读取文件吗?您是否使用 Unix 文件系统,文件名中的字母大小写会有所不同?

标签: import macros sas


【解决方案1】:

如果您有数据集中的文件名列表,您可以使用它来读取文件。

data test.server_file;
  set auto_sds.config;
  length fname $256 ;
  fname = cats("&path_files\",file_name,".txt");
  if fileexist(fname) then do;
    infile in filevar=fname n=12 truncover ;
    input #1 @17 data_file $11. #12 @33 server_records_counts $9. ;
  end;
  else put 'ERROR: File not found ' fname= $quote.;
run;

或者,如果您想要每个文件,那么您甚至不需要从数据集开始。

%LET Path_files = C:\Users\name\Desktop\TEST;
data test.server_file;
  length fname filename $256 ;
  infile "&path_files\*" filename=fname eov=eov truncover ;
  input @;
  filename = fname ;
  if _n_=1 or eov then do;
    input @17 data_file $11. 
      /////////// @33 server_records_counts $9. 
    ;
    output;
  end;
  eov=0;
run;

【讨论】:

  • 感谢您的建议。我想这是我感到困惑的部分,我不知道为什么我们需要 AUTO_SDS.CONFIG 文件?不需要将文本文件中的数据收集到 SAS 中。有没有办法可以跳过使用 AUTO_SDS.CONFIG 的部分?
  • 嗯? AUTO_SDS.CONFIG 不是您要阅读的文本文件列表的来源吗?
  • 我不这么认为。我很抱歉造成混乱。我试图阅读的所有源文件都在 C:\Users\name\Desktop\TEST 文件夹中。 AUTO_SDS.CONFIG 是它在我同事的原始代码中使用的表之一,但它与我在这里尝试做的事情无关。我要做的就是将 C 驱动器中文件夹中的所有文件读入 SAS,并从每个文件中获取特定数据(DATA_FILE 和 SERVER_RECORDS_COUNTS)并放入 SAS 表中。
  • 那么你从哪里得到文件列表呢?您想要文件夹中的所有文件吗?只有名称遵循模式的文件?您确定所有文件都至少有 12 行吗?
  • 我想要该目录中的整个文件列表。每个文件。
【解决方案2】:

您的文件路径周围有单引号。宏变量仅在双引号内解析。尝试改变:

'C:\Users\Name\Desktop\TEST\&next_file&..TXT' 

"C:\Users\Name\Desktop\TEST\&next_file..TXT"

我删除了多余的 & 符号,无论如何这将解决任何问题。

【讨论】:

  • 非常感谢您的意见。我尝试了您的建议,它对目录中的某些文件有效,但对其他文件无效。例如,目录中有10个文件,其中7个成功,其中3个没有显示在TEST.SERVER_FILE中。
  • 你能发布你的日志吗?目前没有足够的信息来提供帮助。需要知道SERVER_FILE 宏变量的值,以及您目录中文件的名称。
  • 对于某些文件,我仍然收到相同的错误消息,它显示路径为“C:\Users\Name\Desktop\TEST\filename.TXT”。在错误消息中。有一个额外的。在文件名之后。那会是问题的来源吗?谢谢!
  • 感谢您的建议。我在帖子中添加了我运行的完整代码和日志中的错误消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2015-08-05
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多