【发布时间】: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 文件系统,文件名中的字母大小写会有所不同?