我只有1行没有换行符(CRLF CRLF),换行符是一个4个字符的字符串,在这个例子中是“@ A $ 3”我现在不需要dlm,我需要从中导入它外部文件(/files/Example.txt)
JOSH 30JUL1984 1011 SPANISH@A$3RACHEL 29OCT1986 1013 MATH@A$3JOHNATHAN 05JAN1985 1015 chemistry
我需要这一行分为3行:
JOSH 30JUL1984 1011 SPANISH
RACHEL 29OCT1986 1013 MATH
JOHNATHAN 05JAN1985 1015 chemistry
我如何在SAS中做到这一点?
*已添加:您的解决方案正在使用此示例,但我有一个问题,一行包含超过行允许的最大长度(32,767字节),
例如,上述练习中的这一行包含5,000条记录。
有可能吗?
答案 0 :(得分:2)
使用DLMSTR=
语句中的infile
选项 - 这将指定“@ A $ 3”作为分隔符。然后在输入语句中使用@@
告诉SAS在同一行上查找更多记录。
data test;
infile "/files/Example.txt" dsd dlmstr='@A$3';
informat var $255.;
input var $ @@;
run;
通过您的示例,您将获得一个包含3条记录的数据集,其中包含您要查找的字符串的1个变量。
根据需要调整var的长度。
答案 1 :(得分:1)
你可以这样做:
首先将文件作为单行导入(确保调整长度):
DATA WORK.IMPORTED_DATA;
INFILE "/files/Example.txt" TRUNCOVER;
LENGTH Column1 $ 255;
INPUT @1 Column1 $255.;
RUN;
然后使用数据步骤将导入的数据解析为变量:
data result (keep=var1-var4);
set WORK.IMPORTED_DATA;
delim = '@A$3';
end = 1;
begin = 1;
do while (end > 0);
end = find(Column1, delim, begin);
row = substr(Column1, begin, end - begin);
var1 = scan(row, 1);
var2 = scan(row, 2);
var3 = scan(row, 3);
var4 = scan(row, 4);
begin = end + length(delim);
output;
end;
run;
答案 2 :(得分:1)
通过将@A$3
视为多字符分隔符,在数据步骤中尝试此操作:
data want (keep=subject);
infile 'C:\sasdata\test.txt';
input;
length line $4500 subject $80;
line=tranwrd(_infile_,"@A$3",'!');
do i=1 by 1 while (scan(line,i,'!') ^= ' ');
subject=scan(line,i,'!');
output;
end;
run;
_infile_
给出了data
步骤中正在读取的当前行。我将多字符分隔符@A$2
转换为单字符分隔符。 tranwrd()
可以替换字符串中的子字符串。然后使用scan()
函数内的分隔符。
此外,如果您想将值分解为单独的变量,只需再扫描一些。例如。将B = scan(subject,2);
之类的内容放入do
循环和data want (keep= A B C D);
。欢呼声。