【发布时间】:2015-05-18 23:58:16
【问题描述】:
我有两个文本文件,一个包含没有标题的原始数据,另一个包含相关的列名和长度。我想使用这两个文件来构建一个 SAS 数据集,其中包含一个文件中的数据以及另一个文件中的列名和长度。
包含数据的文件是一个固定宽度的文本文件。也就是说,每一列数据都与文本文件的特定列对齐,并用空格填充以确保对齐。
数据文件.txt:
John 45 Has two kids
Marge 37 Likes books
Sally 29 Is an astronaut
Bill 60 Drinks coffee
包含元数据的文件以制表符分隔,有两列:一列是数据文件中列的名称,另一列是该列的字符长度。这些名称按照它们在数据文件中出现的顺序列出。
元数据.txt:
Name 7
Age 5
Comments 15
我的目标是拥有一个如下所示的 SAS 数据集:
Name | Age | Comments
-------+------+-----------------
John | 45 | Has two kids
Marge | 37 | Likes books
Sally | 29 | Is an astronaut
Bill | 60 | Drinks coffee
我希望 每个 列都是元数据文件中指定长度的字符。
必须有比我幼稚的方法更好的方法,即使用导入的元数据构造length 语句和input 语句,如下所示:
/* Import metadata */
data meta;
length colname $ 50 collen 8;
infile 'C:\metadata.txt' dsd dlm='09'x;
input colname $ collen;
run;
/* Construct LENGTH and INPUT statements */
data _null_;
length lenstmt inptstmt $ 1000;
retain lenstmt inptstmt '' colstart 1;
set meta end=eof;
call catx(' ', lenstmt, colname, '$', collen);
call catx(' ', inptstmt, cats('@', colstart), colname, '$ &');
colstart + collen;
if eof then do;
call symputx('lenstmt', lenstmt);
call symputx('inptstmt', inptstmt);
end;
run;
/* Import data file */
data datafile;
length &lenstmt;
infile 'C:\datafile.txt' dsd dlm='09'x;
input &inptstmt;
run;
这让我得到了我需要的东西,但必须有一种更清洁的方式。如果为存储length 和input 语句的变量分配的空间不足,或者如果语句长度超过最大宏变量长度,则使用这种方法可能会遇到问题。
有什么想法吗?
【问题讨论】: