4

我只有 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 条记录。

可能吗?

4

3 回答 3

2

使用语句DLMSTR=上的选项——这将指定“@A$3”作为分隔符。infile然后使用@@输入语句告诉 SAS 在同一行查找更多记录。

data test;
infile "/files/Example.txt" dsd dlmstr='@A$3';
informat var $255.;
input var $ @@;
run;

通过您的示例,您将获得一个包含 3 个记录的数据集,其中 1 个变量包含您要查找的字符串。

根据需要调整 var 的长度。

于 2013-12-29T01:44:22.840 回答
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);. 干杯。

于 2013-12-28T22:50:18.043 回答
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;
于 2013-12-28T21:24:33.400 回答