2017-02-17 1 views
0

각 필드를 가져 오기없이 가져 오지 않고도 CSV 파일을 SAS 데이터 세트로 읽는 데 문제가 있습니다. 나는 모든 필드를 수입하는 것을 원하지 않지만, 이것이 작동하도록하는 유일한 방법이다. 문제는 SAS가 열을 올바르게 읽는다고해도 SAS가 데이터를 올바르게 읽을 수 없다는 것입니다 ... 문제의 일부는 내가 읽지 않으려는 실제 열 헤더보다 위에있는 것입니다.SAS - Raw/Delimited 파일 읽기

내 데이터가 너무

somevalue somevalue somevalue... 
var1 var2 var3 var4 
abc abc abc  abc 

내가 someValue와를 제외 할 경우에만 선택 VAR의 및 해당 데이터를 읽어처럼 뻗어있다.

다음은 필자의 입력란에있는 모든 값을 스크램블 한 샘플 파일입니다. 난 단지, AT (46) 열 H (8)을 유지하고 싶은 (57)

여기

... 내가 지금까지 시도했습니다 몇 가지 코드의이 SAS는 PROC의 수입에서 발생했다. 내 PROC 가져 오기 필드 값을 읽을 잘 작동했기 때문에 내가 원하지 않는 필드를 삭제했지만 예상 한 출력을 얻지 못합니다. 필드에 해당하는 값이 일치하지 않습니다.

A) PROC IMPORT 
       DATAFILE="C:\Users\dip1\Desktop\TU_&YYMM._FIN.csv" 
       OUT=TU_&YYMM._FIN 
       DBMS=csv REPLACE; 
       GETNAMES=NO; 
       DATAROW=3; 


RUN; 

은 SAS 로그에이 생성 나는 또한 다음이 시도했습니다

B) DATA TU_&YYMM._FIN_TEST; 
infile 'C:\Users\fip1\Desktop\TU_1701_FIN.csv' delimiter = ',' DSD lrecl=32767 
firstobs=3 ; 
informat VAR8 16. ; 
informat VAR46 $1. ; 
informat VAR57 $22. ; 
format VAR8 16. ; 
format VAR46 $1. ; 
format VAR57 $22. ; 
input 
VAR8 
VAR46 $ 
VAR57 $; 
run; 

(내가 원하는하지 않은 다른 필드를 잘라) ... 난 그냥 누락 생각

D) DATA TU_TEST; 

INFILE "C:\Users\fip1\Desktop\TU_&yymm._fin.csv" DLM = "," TRUNCOVER FIRSTOBS = 3; 

LABEL ACCOUNT_NUMBER = "ACCOUNT NUMBER"; 

LENGTH ACCOUNT_NUMBER $16. 
     E $1. 
     REJECTSUBCATEGORY $22.; 

INPUT @8 ACCOUNT_NUMBER 
     @46 E 
     @57 REJECTSUBCATEGORY; 
RUN; 
: 뭔가 ..

C) DATA TU_TEST; 

INFILE "C:\Users\fip1\Desktop\TU_&yymm._fin.csv" DLM = "," TRUNCOVER FIRSTOBS = 3; 

LABEL ACCOUNT_NUMBER = "ACCOUNT NUMBER"; 

LENGTH ACCOUNT_NUMBER $16. 
     E $1. 
     REJECTSUBCATEGORY $22.; 

INPUT ACCOUNT_NUMBER 
     E 
     REJECTSUBCATEGORY; 
RUN; 

뿐만 아니라 위를, 나는에 읽고 싶은 컬럼 SAS 포인트를하려고 수정로

어느 것도 작동하지 않습니다. 다시 말하지만, A) 또는 B)를 사용하여 모든 필드를 가져 오면 B)는 모든 필드를 포함하지만 C) 또는 D)를 사용할 수는 없지만이 필드를 성공적으로 수행 할 수 있습니다. 가능한 경우 코드를 최소한으로 유지하십시오. 나는 뭔가를 놓쳤다 고 확신하지만, 나는 그걸로 팅커를 칠 시간이 없었어. 나는 이제 그걸 "긴"방법으로 해왔다. ...

다음은 데이터 모양을 보여주고있다.

당신은 당신이 모든을 유지하지 않으려는 경우에도 (유지하려는 마지막까지 또는 필드의 적어도 모든) 모든 필드를 읽을 필요가 구분 된 파일로
A(1)  B(2)  C(3)   D(4)   E(5)  F(6)  G(7) 
ABCDEFGHIJ ABCDMCARD 202020 4578917  12345674 457894A (blank) 
    CRA  INTERNALID SUBCODE  RKEY   SEGT  FNM  FILEDATE 
CREDITBUR  2ABH123 AB2CHE123 A28O5176688  J2  Name  8974561 

답변

1

그 들판. 건너 뛰려는 대상의 경우 더미 변수로 읽어 들일 수 있습니다. 또는 유지하려는 변수 중 하나라도 나중에 열을 읽으면 덮어 쓰게됩니다.

또한 PROC IMPORT가 생성 한 코드 뒤에 DATA 단계를 모델링하지 마십시오. 직접 더 깨끗한 코드를 만들 수 있습니다. 예를 들어 나열된 세 변수에 대해 FORMAT 또는 INFORMAT 문을 사용할 필요가 없습니다. VAR8에 실제로 16 자리가 필요한 경우 SAS에 BEST12를 사용하지 않도록 포맷을 첨부 할 수 있습니다. 체재.

data tu_&yymm._fin_test; 
    infile 'C:\Users\fip1\Desktop\TU_1701_FIN.csv' 
     dlm=',' dsd lrecl=32767 truncover firstobs=3 
    ; 
    length var8 8 var46 $1 var57 $22 ; 
    length dummy $1 ; 
    input 7*dummy var8 37*dummy var46 10*dummy var57 ; 
    drop dummy ; 
    format var8 16. ; 
run; 

원하는 경우 (또는 RENAME 문을 추가하는 경우) VARxx 변수 이름을 더 의미있는 이름으로 바꿀 수 있습니다.여기서 위치 번호를 사용하면이 코드에서 INPUT 문이 입력 데이터에서 57 개의 열을 읽는 것이 명확 해집니다.

+0

아, 문제를 이해하고 있습니다. SAS는 변수 헤더를 잘 읽었습니다. SAS가 필드 이름을 "알고있는"것으로 알고 그 아래의 데이터를 남용한 것 같습니다. 기본적으로, 예 C)에서했던 것은 필드 이름을 변경하면서 필드 값을 유지하는 것이 었습니다. 나는 당신이하고있는 것이 적절한 값을 읽는 입력 버퍼의 위치를 ​​밀어 내고 있다고 믿는다 ... (도살 될 수도있다) – DukeLuke

+0

"더미"와 내가 원하는 실제 필드 사이에 두 개의 길이 문장이있는 이유가 있을까? 용도? – DukeLuke

+1

코드를 읽기 쉽게하기 위해 두 개의 LENGTH 문을 사용했습니다. 한 곳에서 테이블에 대한 변수를 정의하고 싶습니다. DUMMY 변수는 실제로 출력 테이블에 포함되지 않으므로 별도의 명령문에 넣습니다. – Tom