2013-01-18 61 views
1

everyone。來自.txt的SAS輸入,其中輸入跨越多行

我有一個問題讓我瘋狂。

說我有看起來像這樣的2個文本文件:

File_one.txt:

Name_sample_f1  *spans one line 
File_sample_f1  *spans one line 
String_sample_f1  *spans multiple, varying lines until the end of the file 
String_sample_f1 

File_two.txt:

Name_sample_f2  *spans one line 
File_sample_f2  *spans one line 
String_sample_f2  *spans multiple, varying lines until the end of the file 
String_sample_f2 
String_sample_f2 
String_sample_f2 

我想輸入他們兩個到一個名爲的數據集測試並採取以下形式:

Name    File    String 
    ----    ----    ------ 
1 Name_sample_f1 File_sample_f1 String_sample_f1 
             String_sample_f1 
2 Name_sample_f2 File_sample_f2 String_sample_f2 
             String_sample_f2 
             String_sample_f2 
             String_sample_f2 

我很感激它,如果任何人都可以提供幫助!

感謝

回答

0
filename file1 'testfile1.txt'; 
filename file2 'testfile2.txt'; 

DATA file1; 
LENGTH thisname thisfile thistext $ 200; 
RETAIN thisname thisfile; 
linecounter=0; 
DO UNTIL(eof); 
    INFILE file1 end = eof; 
    INPUT; 
    linecounter+1; 
    IF (linecounter eq 1) THEN thisname=_infile_; 
    ELSE IF (linecounter eq 2) then thisfile=_infile_; 
    ELSE DO; 
    thistext=_infile_; 
    output; 
    END; 
END; 
RUN; 


DATA file2; 
LENGTH thisname thisfile thistext $ 200; 
RETAIN thisname thisfile; 
linecounter=0; 
DO UNTIL(eof); 
    INFILE file2 end = eof; 
    INPUT; 
    linecounter+1; 
    IF (linecounter eq 1) THEN thisname=_infile_; 
    ELSE IF (linecounter eq 2) then thisfile=_infile_; 
    ELSE DO; 
    thistext=_infile_; 
    output; 
    END; 
END; 
RUN; 

DATA all_files; 
SET file1 file2; 
RUN; 

PROC PRINT DATA=all_files; RUN; 
+1

感謝您發表的答案!雖然代碼片段可以回答這個問題,但添加一些附加信息仍然很棒,比如解釋等。 – j0k

+0

我也很欣賞這一點,但實際上並沒有做我想做的事情。我也很欣賞這一點,但它實際上並沒有做我想做的事情。 – Brad

1

你不必這樣做相當複雜的三個datasteps(特別是如果你打算做N個文件)。這很容易,真的。使用EOV指示器(音量結束)可以查看新文件的開始時間[EOV在結束音量/文件後跳脫],並且每當您處於新文件開始時,讀取前兩行中的名稱和文件名。

data test; 
format name filename $100.; 
retain name filename line; 
infile '("c:\temp\file1.txt", "c:\temp\file2.txt")' eov=end lrecl=100 pad truncover; *or use wildcards, like infile "c:\temp\file*.txt"; 
input a $ @; 
put _all_; 
if (_n_=1) or (end=1) then do; 
    end=0; 
    line=1; 
end; 
else line+1; 
if line=1 then do; 
    input @1 name $100.; 
end; 
else if line=2 then do; 
    input @1 filename $100.; 
end; 
else do; 
    input @1 string $100.; 
    output; 
end; 
run; 
+0

編輯*我與這個有同樣的問題。它給我多個觀察/記錄,而不是每個文件只有一個 – Brad