4

改行なし (CRLF CRLF) の 1 行しかありません。改行は 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=ステートメントでオプションを使用しますinfile。これにより、"@A$3" が区切り文字として指定されます。次に@@、入力ステートメントで を使用して、SAS に同じ行でさらにレコードを探すように指示します。

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

あなたの例では、探している文字列を含む1つの変数を持つ3つのレコードを持つデータセットを取得します。

必要に応じて var の長さを調整します。

于 2013-12-29T01:44:22.840 に答える
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;
于 2013-12-28T21:24:33.400 に答える