2017-09-14 9 views
0

*** 해결되었습니다. 그 답은 결국 첨부 될 것입니다. 도와 주셔서 감사합니다!SAS의 한 디렉토리에있는 여러 텍스트 파일의 특정 데이터 읽기

감사합니다. 나는 이전 동료가 남긴 코드 조각에 대해 연구 중이다.

목적은 하나의 디렉토리에있는 여러 텍스트 파일에서 특정 데이터 (예 : 행 1 & 열 17 및 행 12 & 열 33)를 읽고 데이터를 SAS 테이블에 저장하는 것입니다.

%macro cycle_through_server_records; 

%local i next_file; 
%do i=1 %to %sysfunc(countw(&SERVER_FILE)) ; 
%let next_file = %scan(&SERVER_FILE, &i); 
%let Ext =.TXT ; 

DATA TEST.LIC_SERVER; 
INFILE 'C:\Users\Name\Desktop\TEST\&next_file&..TXT' FIRSTOBS=1 OBS=12 
MISSOVER; 
INPUT 
@17 DATA_FILE $11./////////// 
@33 SERVER_RECORDS_COUNTS $9. ; 
RUN; 

PROC APPEND BASE=TEST.SERVER_FILE DATA=TEST.LIC_SERVER FORCE; 
RUN; 

%END; 
%MEND cycle_through_server_records; 

%cycle_through_server_records; 

매크로 변수는 SQL 쿼리를 통해 메타 데이터 파일에서 설정됩니다. "실제 파일이 존재하지 않는, C : 이름 \ 바탕 화면 \ 테스트 \ & & next_file ..TXT \ 사용자 \ ERROR"

proc sql noprint; 
select State 
    , compare_Date 
    , Data_Source 
    , Source_Date 
    , file_name 
    , Source_file_date 
    into :total_state separated by ' ' 
    , :compare_date separated by ' ' 
    , :Data_Src separated by ' ' 
    , :Source_Cd_Date separated by ' ' 
    , :Server_file separated by ' ' 
    , :Src_file_dt separated by ' ' 
    from AUTO_SDS.config 
; 
quit; 

내가 SAS에서 그것을 실행 때마다, 나는이 오류 메시지가 나타납니다. 파일 경로에 어떤 문제가 있는지 잘 모르겠습니다.

또한 오류 메시지와 함께 코드를 실행할 수있었습니다. 그러나 단 하나의 텍스트 파일에서 9 개의 반복 행을 반환했습니다 (디렉토리에 여러 개의 텍스트 파일이 있음). 나는 붙어있다. 누군가가 문제 해결을 도와 주시겠습니까?

미리 감사드립니다.

나는 제안한 코드와 로그 파일을 게시하고 있습니다. 고맙습니다!

%LET Path_files = C:\Users\name\Desktop\TEST; 

%macro cycle_through_server_records; 
%local i next_file; 
%do i=1 %to %sysfunc(countw(&SERVER_FILE)) ; 
%let next_file = %scan(&SERVER_FILE, &i); 

DATA TEST.LIC_SERVER; 
INFILE "&Path_files\&next_file&..TXT" FIRSTOBS=1 OBS=12 MISSOVER; 
INPUT 
@17 DATA_FILE $11./////////// 
@33 SERVER_RECORDS_COUNTS $9. ; 
RUN; 

PROC APPEND BASE=TEST.SERVER_FILE DATA=TEST.LIC_SERVER FORCE; 
RUN; 

%END; 
%MEND cycle_through_server_records; 

%cycle_through_server_records; 

PROC SORT DATA=TEST.SERVER_FILE NODUP; 
BY DATA_FILE; 
RUN; 

디렉토리에 22 개 파일이 있습니다, 그들의 이름은 다음 형식 "State_201708"모든 그리고 그들은 텍스트 문서 (.txt)로한다.

출력 데이터 세트 TEST.SERVER_FILE에는 하나의 파일 데이터 만 있습니다.

SAS 로그 :

디렉토리에 파일 8 건 (나는 하나의 파일의 데이터가 성공적으로 캡처있어 이후로는 8 왜 확실하지 않다, 대신 21) 8 오류 메시지가 있습니다. 오류 메시지는 다음과 같습니다.

오류 : 실제 파일이 존재하지 않습니다 (C : \ Users \ name \ Desktop \ TEST \ State_201708.TXT).

도움 주셔서 감사합니다.

*** 해결책 귀하의 모든 의견과 동료의 도움을 통해 디렉토리의 일부 파일에서만 작동하는 이유는 모두 발견 한 것이지만 전부는 아닙니다. Tom이 아래에서 지적했듯이 변수 SERVER_FILE (여기서 사용되지 않는 CONFIG 테이블에서)에서 정보를 검색하고있었습니다.

우리는 매크로를 만들기 전에 추가 단계를 추가하여 디렉토리에서 모든 파일 이름을 읽고이를 SAS 테이블에 저장했습니다. 그런 다음 해당 열을 변수로 바꿨습니다. SERVER_FILE을 새 변수 이름으로 대체하십시오. 이제 효과가있었습니다!

+0

여기서 매크로 변수 SERVER_FILE을 (를) 설정하고 있습니까? – Tom

+0

그건 아주 좋은 질문입니다! 내 동료 코드에서 매크로 변수 SERVER_FILE을 검색하고있었습니다. 코드의 다른 섹션에서만 한 번 나타났습니다. 아래 코드의 해당 부분을 첨부합니다. 감사! –

+0

형식이 질량 일 경우 사과드립니다. 코멘트 섹션에 코드를 입력하는 방법을 모르겠습니다. 이 코드는 SERVER_FILE 변수가 AUTO_SDS.config 테이블에서 설정된다는 것을 보여 주며,이 작업은 내가하려고하는 목적에 필요하지 않습니다. 코드 : proc sql noprint;선택 상태, compare_Date, 데이터 _ 소스, 원본 _ 날짜, 파일 _ 이름, 원본 _ 파일 _ 날짜 입력 : total_state ',':로 구분 된 total_state '', :로 분리 된 Data_Src '', : '로 구분 된 Source_Cd_Date,': : Src_file_dt는 AUTO_SDS.config의 ' '으로 구분됩니다. 종료; –

답변

0

데이터 집합에 파일 이름 목록이 있으면 파일을 읽을 때 사용할 수 있습니다.

data test.server_file; 
    set auto_sds.config; 
    length fname $256 ; 
    fname = cats("&path_files\",file_name,".txt"); 
    if fileexist(fname) then do; 
    infile in filevar=fname n=12 truncover ; 
    input #1 @17 data_file $11. #12 @33 server_records_counts $9. ; 
    end; 
    else put 'ERROR: File not found ' fname= $quote.; 
run; 

또는 모든 파일을 원한다면 데이터 세트로 시작할 필요조차 없습니다.

%LET Path_files = C:\Users\name\Desktop\TEST; 
data test.server_file; 
    length fname filename $256 ; 
    infile "&path_files\*" filename=fname eov=eov truncover ; 
    input @; 
    filename = fname ; 
    if _n_=1 or eov then do; 
    input @17 data_file $11. 
     /////////// @33 server_records_counts $9. 
    ; 
    output; 
    end; 
    eov=0; 
run; 
+0

제안 해 주셔서 감사합니다. 내가 혼란스러워하는 부분 인 것 같은데, 왜 AUTO_SDS.CONFIG 파일이 필요한지 모르겠다. 텍스트 파일에서 SAS로 데이터를 수집하는 데 필요하지 않습니다. AUTO_SDS.CONFIG를 사용하는 부분을 건너 뛸 수있는 방법이 있습니까? –

+0

응? AUTO_SDS.CONFIG가 읽으려는 텍스트 파일 목록의 소스가 아닙니까? – Tom

+0

나는 그렇게 생각하지 않는다. 혼란 스럽습니다. 내가 읽으려고하는 모든 소스 파일은 C : \ Users \ name \ Desktop \ TEST 폴더에 있습니다. AUTO_SDS.CONFIG는 동료의 원래 코드에서 사용한 표 중 하나 였지만 여기에서 수행하려고 시도한 것과 관련이 없습니다. 제가하려는 것은 C 드라이브에있는 폴더의 모든 파일을 SAS로 읽어 들이고 각 파일에서 특정 데이터 (DATA_FILE 및 SERVER_RECORDS_COUNTS)를 가져 와서 SAS 테이블에 넣는 것입니다. –

1

파일 경로 주위에 작은 따옴표가 있습니다. 매크로 변수는 큰 따옴표로만 해결됩니다.변경 시도 :

'C:\Users\Name\Desktop\TEST\&next_file&..TXT' 

어쨌든 아무것도 해결 한 것 여분의 앰퍼샌드, 제거

"C:\Users\Name\Desktop\TEST\&next_file..TXT" 

에.

+0

입력 해 주셔서 대단히 감사드립니다. 나는 당신이 제안한 것을 시도해 보았고, 디렉토리에있는 파일 중 일부는 괜찮 았지만 나머지는 제대로 작동하지 않았다. 예를 들어, 디렉토리에 10 개의 파일이 있으며 그 중 7 개가 성공했으며 그 중 3 개가 TEST.SERVER_FILE에 표시되지 않았습니다. –

+0

로그를 게시 할 수 있습니까? 현재 도움이되는 정보가 충분하지 않습니다.'SERVER_FILE' 매크로 변수의 값과 디렉토리에있는 파일의 이름을 알아야합니다. –

+0

일부 파일에 대해 여전히 같은 오류 메시지가 표시되고 "C : \ Users \ Name \ Desktop \ TEST \ filename.TXT"와 같은 경로가 표시됩니다. 오류 메시지. 여분이 있습니다. 파일 이름 뒤에. 문제가 어디서 발생 했습니까? 고맙습니다! –