2013-11-02 2 views
1

SAS 명명 된 파이프를 사용하여 SAS 프로세스에서 데이터를 교환하는 방법을 알아 내려고하고 있습니다.명명 된 파이프를 사용하여 ods 출력 및 데이터 세트 전송

서버 서버 코드에서 나는 파일을 넣어 문을 주석 처리를 제거하고 거의 모든를 ODS 및 PROC 인쇄를 제거하면

FILENAME stdout namepipe '\\.\pipe\Sas\PipeOut' server eofconnect retry=15 block; 
FILENAME DIRLIST pipe 'dir "C:\atemp"'; 
data dirlist ; 
    length buffer $256; 
    infile dirlist length=reclen; 
    input buffer $varying256. reclen; 
    *file stdout; 
    *put buffer; 
ods listing file=stdout; 
proc print data=dirlist; 
run; 

클라이언트

FILENAME stdin namepipe '\\.\pipe\Sas\PipeOut' client eofconnect retry=15 block; 
data d1; 
    length buffer $ 256; 
    infile stdin length=reclen; 
    input buffer $varying256. reclen; 
    put buffer; 
run; 

: 다음은 간단한 예입니다 예상대로 작동합니다. 코드는 내가 예상하지 못한 결과를 낳습니다. 서버 코드를 실행 한 다음 클라이언트 코드를 시작합니다. 클라이언트 코드가 실행되지만 제로 관측치를 읽습니다. 그런 다음 클라이언트 코드를 재실행하면 (서버 시간 초과 전에) 60 줄 정도의 예상 줄을 읽은 다음 중단됩니다 (종료되지 않습니다). 내 생각에 ods listing 문은 파일을 닫은 다음 다시 열어서 닫는다. 아무도 무슨 일이 벌어지고, 멈추지 않고 첫 번째 실행에서 클라이언트의 ods 출력을 얻는 방법을 알고 있습니까?

내가하고 싶은 것은 서버에 설정된 데이터를 파이프로 출력하고 클라이언트의 데이터 세트 참조로 사용하는 것입니다. 일반적으로이 작업은 라이브러리 참조를 사용하여 수행되며 파이프 참조가 라이브러리 참조로 표시 될 수 있는지 또는 알 수 없습니다. 그 마지막 부분이 의미가 있기를 바랍니다.

답변

1

먼저 걸기를 수정하려면 서버에서 파이프를 닫아야합니다.

ods listing close; 

클라이언트를 두 번 실행해야한다고 설명 할 수 없습니다.

코드를 다음으로 변경하면 작동합니다.

서버

FILENAME stdout namepipe '\\.\pipe\Sas\PipeOut' server eofconnect retry=15 block; 
FILENAME DIRLIST pipe 'dir "C:\temp"'; 
data dirlist ; 
    length buffer $256; 
    infile dirlist length=reclen; 
    input buffer $varying256. reclen; 
    *file stdout; 
    *put buffer; 
run; 

ods listing file=stdout; 

proc print data=dirlist; 
run; 

ods listing close; 

클라이언트

FILENAME stdin namepipe '\\.\pipe\Sas\PipeOut' client retry=15 ; 

/*Extra read to clear whatever weirdness ODS does.*/ 
data _null_; 
infile stdin; 
input; 
run; 

data d1; 
    length buffer $ 256; 
    infile stdin length=reclen; 
    input buffer $varying256. reclen; 
    put buffer; 
run; 

나는 의심의 ODS 문이 파일을 작성하는 일을한다는 것을. 이것은 파이프에 대한 첫 번째 쓰기입니다. 파이프에 대한 다음 쓰기는 수정입니다. 그래서 두 번 읽어야합니다.

데이터 공유에 대한 두 번째 질문입니다. 바이너리 형식으로 데이터 세트를 파이프 할 수 있는지 확신하지 못합니다. 파이프에 CSV와 같은 내용으로 작성하여 클라이언트의 데이터 세트로 읽을 수 있습니다.

임시 파일에 결과를 작성해야 클라이언트에서 서버

FILENAME stdout namepipe '\\.\pipe\Sas\PipeOut' server eofconnect retry=15 block; 

proc export data=sashelp.class outfile=stdout dbms=csv replace; 
run; 

filename stdout clear; 

. Proc IMPORT는 임의 액세스가 필요하며 임의로 명명 된 파이프에 액세스 할 수 없습니다.

FILENAME stdin namepipe '\\.\pipe\Sas\PipeOut' client retry=15 ; 

filename x temp; 
data _null_; 
    length buffer $4000.; 
    infile stdin length=reclen; 
    file x; 
    input; 
    buffer = _infile_; 
    put buffer; 
run; 

proc import file=x out=class dbms=csv replace; 
run; 

filename x clear; 
+0

답장을 보내 주셔서 감사합니다. ods 닫기 및 추가 입력 단계는 읽기 및 정지 문제를 처리했습니다. 바이너리 데이터 세트 전송이 불가능할 수도 있습니다. 나는 파일을 쓰는 것을 피하고 싶기 때문에 그들의 길을 희망하면서 며칠 동안 질문을 공개적으로 남겨 둘 것입니다. – Dweeberly

+0

답변으로 표시하겠습니다. 이 방법으로 (2 진) 데이터 세트를 전달할 수 없을 수도 있습니다. 다른 정보는 자리에 있었고 매력처럼 일했습니다. 다시 한 번 감사드립니다. – Dweeberly

관련 문제