Import SAS在没有换行CRLF的情况下从一行读取多条记录

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做到这一点 *补充:您的解决方案正在使用此示例,但我有一个问题,一行包含的长度超过了该行允

我只有一行没有换行符(CRLF CRLF),换行符是一个4个字符的字符串,在这个例子中是“@a$3”,我现在不需要dlm,我需要从外部文件(/files/example.txt)导入它

我需要把这一行分成三行:

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;