2017-11-09 3 views
1

SAS Enterprise Guide로 데이터를 가져 오려고 시도했습니다. 이 파일은 원래 Mac에서 Excel 문서를 저장하여 생성 된 csv입니다. Date, DayOfYear 및 MonthOfYear의 세 열이 있습니다.SAS CSV 가져 오기가 정크 데이터 열을 추가합니다.

내 수입 코드는 다음과 같습니다

DATA indata; 
    INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=','; 
    INPUT Date YYMMDD10. DayOfYear MonthOfYear; 
    FORMAT Date YYMMDD10.; 
RUN; 

문제는 날짜 열이 하나의 열을 기준으로 이상 이동 후이 모든 것을 초래한다는 것이다. 예 출력 :

Date  | DOY | MOY 
2017-01-01 |  | 1 
2017-01-02 |  | 2 
2017-01-03 |  | 3 

내 해키 솔루션은 모든 빈 값을 얻을 수있는 정크라는 여분의 열을 추가했습니다,하지만 난 가능하면 진짜이 문제를 해결하고 싶습니다. 아래의 해킹.

DATA indata; 
    INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=','; 
    INPUT Date YYMMDD10. junk DayOfYear MonthOfYear; 
    FORMAT Date YYMMDD10.; 
RUN; 

Date  | junk | DOY | MOY 
2017-01-01 |  | 1 | 1 
2017-01-02 |  | 2 | 1 
2017-01-03 |  | 3 | 1 

줄 바꿈과 캐리지 리턴으로 아무렇지도 않게 시도했습니다. 나는 DSD와 DLM을 둘 다 넣었지만 아무 것도 바뀌지 않았다. 그것은 날짜 자체의 열에 끝나는 여분의 보이지 않는 문자가 끝나는 것처럼 보이지만 16 진수 편집기에서 데이터를 볼 때 거기에 아무것도. 예 :

ef bb bf 32-30 31 37 2d-30 31 2d 30-31 2c 31 ... 

2017-01-01에서 쉼표로 1로 곧바로 이동하므로 숨겨진 문자가 없습니다. 나는 이것이 어떻게 다른 일이 일어날 지 모른다. 이것은 제가이 문제를 가지고있는 두 번째 파일입니다. 그래서 그것은 단지 하나의 것이 아니라는 것을 압니다.

제 질문을 요약하면 어떻게 날짜 열거 형 후에 단지 여분의 열을 만들지 않습니까?

+1

생각해 보았지만,'INPUT Date : YYMMDD10.'과 같이 형식화 된 입력을 적용하기 위해 콜론 (:)을 사용하면 어떨까요? –

+1

@Allan Bowe 고쳐 주셨습니다. 자유롭게 답변을 추가하면 받아 들일 것입니다. –

답변

2

다음과 같이, 귀하의 의견 문에서 정보 흐름을 적용 콜론 (:) 사용해야합니다

: (콜론) 형식 수정을 할 수 있습니다

DATA indata; 
    INFILE '/sasdata/{path_to_file}' TERMSTR=cr DSD DLM=','; 
    INPUT Date : YYMMDD10. DayOfYear MonthOfYear; 
    FORMAT Date YYMMDD10.; 
RUN; 

으로 documentation 당 목록 입력을 사용하고 문자 또는 숫자 여부에 관계없이 을 사용하여 변수 이름 뒤에 정보를 지정합니다. SAS는 빈 열, 변수의 길이 (문자 만) 또는 데이터 행의 끝에 중 먼저 오는 것을 만날 때까지 읽습니다.

1

구분 된 데이터를 읽는 경우 목록 모드 입력을 사용해야합니다. INPUT 문에서 모든 정보를 제거하거나 문에 정보 앞에 : 수정자를 추가하여 수정 된 목록 모드를 계속 사용하도록 할 수 있습니다. informats에서 입력 정보를 제거하면 INFORMAT 문을 사용하여 SAS에 날짜 변수를 읽는 방법을 알릴 수 있습니다.

data indata; 
    infile '/sasdata/{path_to_file}' termstr=cr dsd truncover ; 
    length Date DayOfYear MonthOfYear 8; 
    input Date DayOfYear MonthOfYear; 
    informat date yymmdd. ; 
    format Date yymmdd10.; 
run; 

나쁜 모두 세 가지 일이 일어날 수있는 구분 된 데이터 라인을 읽을 때 당신은 형식의 입력을 사용하는 SAS에게

.

(1) 너무 적은 문자를 읽고 잘못된 결과를 얻을 수 있습니다. 그러면 나머지 날짜 값이 다음 열의 값으로 읽혀집니다.

(2) 너무 많은 문자를 읽고 날짜 또는 일부 값의 일부로 다음 구분 기호를 읽으십시오.그리고 다음 열에 대해 읽을 다음 값의 일부만 남겨 둘 수 있습니다.

(3) 날짜가 맞도록 정확하게 문자를 읽고 다음 구분 기호 앞에 커서 위치를 그대로 두십시오. 그런 다음 DSD 옵션을 사용하여 Null 값을 허용하면 SAS가 다음 값을 null로 간주하여 나머지 모든 줄을 잘못된 열로 옮깁니다.

+0

제가 이해할 수 있도록. 날짜 정보를 추가 했으므로 이전 줄에 지정된 구분 기호를 찾는 것보다 우선합니다. 정보를 별도의 행에 지정하면 분리 문자가 먼저 열을 분리 한 다음 정보가 적용됩니다. –

+1

'input date yymmdd10 '이라고하면 정확히 10자를 읽는 것을 의미합니다. 목록 스타일을 사용하면 구분 기호에 따라 다음 단어에있는 문자 수만큼 읽습니다. 목록 모드를 사용할 때 SAS는 정보 저장소의 너비를 무시하고 실제 데이터의 너비에 사용되는 너비를 조정합니다. – Tom

관련 문제