Import SAS在没有换行CRLF的情况下从一行读取多条记录
我只有一行没有换行符(CRLF CRLF),换行符是一个4个字符的字符串,在这个例子中是“@a$3”,我现在不需要dlm,我需要从外部文件(/files/example.txt)导入它 我需要把这一行分成三行:Import SAS在没有换行CRLF的情况下从一行读取多条记录,import,sas,linefeed,Import,Sas,Linefeed,我只有一行没有换行符(CRLF CRLF),换行符是一个4个字符的字符串,在这个例子中是“@a$3”,我现在不需要dlm,我需要从外部文件(/files/example.txt)导入它 我需要把这一行分成三行: JOSH 30JUL1984 1011 SPANISH RACHEL 29OCT1986 1013 MATH JOHNATHAN 05JAN1985 1015 chemistry 我怎么能在SAS做到这一点 *补充:您的解决方案正在使用此示例,但我有一个问题,一行包含的长度超过了该行允
JOSH 30JUL1984 1011 SPANISH
RACHEL 29OCT1986 1013 MATH
JOHNATHAN 05JAN1985 1015 chemistry
我怎么能在SAS做到这一点
*补充:您的解决方案正在使用此示例,但我有一个问题,一行包含的长度超过了该行允许的最大长度(32767字节)
例如,上述练习中的此行包含5000条记录
有可能吗?您可以这样做: 首先将文件作为单行导入(请确保调整长度): 然后使用数据步骤将导入的数据解析为变量:
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;
在数据步骤中,将
@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;
\u infle
给出在数据
步骤中读取的当前行。我将多字符分隔符@A$2
转换为单字符分隔符tranwrd()
可以替换字符串中的子字符串。然后在scan()函数中使用分隔符
此外,如果您想将这些值分解为单独的变量,只需再扫描一些即可。例如,放置类似B=scan(受试者,2)的东西编码>进入do
循环和所需数据(保持=A B C D)代码>。干杯。使用infle
语句上的DLMSTR=
选项——这将指定“@A$3”作为分隔符。然后在输入语句中使用@
,告诉SAS在同一行中查找更多记录
data test;
infile "/files/Example.txt" dsd dlmstr='@A$3';
informat var $255.;
input var $ @@;
run;
在您的示例中,您将获得一个包含3条记录的数据集,其中1个变量包含您要查找的字符串
根据需要调整var的长度。我们对DLMSTR=
有问题,它无法识别@A$3@A$3
作为缺少的值。这是在SAS 9.2中出现的,可能现在已经修复了。@DejanPeretin我也曾想过使用DLMSTR=
来指定多字符分隔符,但它可能无法在所有版本中使用。因此,需要使用单个字符分隔符的替代转换方法。我认为DomPazz的DLMSTR=
应该可以很好地用于SAS 9.2和更高版本,因为它是在9.2中引入的,但是对于9.1.3和更高版本,它会返回错误。发现这一点:如果文件中有连续的分隔符字符串指示缺少值,那么DLMSTR=选项在SAS 9.3之前不会正确读取文件。来源:如果您只是试图从一行文本中读取多条记录,请在“输入”行的末尾附加“@@”,例如:input column1 255@;
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;
data test;
infile "/files/Example.txt" dsd dlmstr='@A$3';
informat var $255.;
input var $ @@;
run;