***已解决。答案将在最后附上。谢谢大家的帮助!
感谢您阅读本文。我正在处理我的前同事留下的一段代码,并尝试从中得出一些意义。
目的是从一个目录中的多个文本文件中读取特定数据(例如,来自第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"它们是文本文档(.txt)。
输出数据集TEST.SERVER_FILE只有一个文件的数据。
SAS日志:
目录中有8个文件有8条错误消息(我不知道它为什么是8,而不是21。因为只有一个文件的数据被成功捕获)。错误消息如下所示:
错误:物理文件不存在,C:\ Users \ name \ Desktop \ TEST \ State_201708.TXT。
感谢您的帮助!
***解决方案 通过您的所有评论和同事的帮助,我们找到了原因,为什么它只适用于目录中的某些文件,但不是全部。正如Tom在下面指出的那样,它是从变量SERVER_FILE(来自CONFIG表,这里没有使用)中检索信息。
我们做了什么让它工作:我们在宏之前添加了一个额外的步骤来从目录中读取所有文件名并将它们放在SAS表中。然后将该列转换为变量。用新变量名替换SERVER_FILE。现在它奏效了!
答案 0 :(得分:1)
您的文件路径周围有单引号。宏变量仅在双引号内解析。尝试更改:
'C:\Users\Name\Desktop\TEST\&next_file&..TXT'
到
"C:\Users\Name\Desktop\TEST\&next_file..TXT"
我删除了额外的&符号,无论如何都不会解决任何问题。
答案 1 :(得分:0)
如果您拥有数据集中的文件名列表,则可以使用该列表来读取文件。
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;