我有一个包含大量信息的文本文件c:\test.txt
,我只需要文件中的一些细节。以下是我的数据的外观
an army of ants
bchskkkk/kk/kl
id: intyst@abc.com
subject: this is an email
to xyz
kkdkdlkadkadk;kd;
jjdjsjdlasjdaljdljd
<st> This is my actual content
klfjaakjalkjflajflajefljalkfj
daklkajflkjalfkjaljflkajfkl
kkdlkal;dka;ldk <st>
在上面以id,subject和带有start和end的几行开头的行就像我在数据集中所需要的那样
这就是我试过的
filename data 'c:\test.txt';
data want;
infile data lrecl=1000 missover;
input #3 $ id 3-25 #4 $ sub1 10-25 #8 $ cmc 4-55
run;
以上并没有解决我的目的。我在每个文件中都有大约10k行,上面的格式和文本之间的和可以超过10行。
有没有更好的方法来解决这个问题?
谢谢
答案 0 :(得分:1)
您无法使用单个输入语句获取数据。
您需要进行“地标”检测才能发现并提取所需的数据部分,同时保留扫描文件时找到的部分。
假设id:
始终是一个新的数据集行指示符,并始终作为行的最后一部分出现,以下内容可以正常工作(未经测试):
data messages;
length id $50;
length subject $100;
length message $1000;
retain id subject message;
infile data lrecl=1000 _infile_=line;
input;
if line =: "id" then do;
id_line_number = _n_;
id = substr(line,length("id:")+1);
subject = "";
content = "";
end;
if subject = "" and line =: "subject:" then do;
subject = substr(line,length("subject:")+1);
end;
if message = "" then do;
if line =: "<st>" then do;
* initial line in <st> block;
message = line;
end;
end;
else do;
* accumulate lines within <st> block;
message = trim(message) || ' ' line;
end;
* termination of <st> block, triggers a complete record and output to data set;
if length(message)>4 and substr(message,length(message)-3) = "<st>" then do;
message = substr(message,5,length(message)-8);
output;
message = "";
end;
run;
如果主题可以被包装并且在后续相邻行中作为缩进内容继续进行,则需要一些额外的编码