2017-11-02 1 views
1

JSON 파일의 데이터를 SAS의 테이블로 가져 오려고합니다. 유감스럽게도 SAS JSON 엔진을 사용할 수 없습니다. 지금까지 거의 모든 데이터를 테이블에 저장했습니다. 몇 가지 값을 놓치고 있습니다.SAS JSON libname 엔진없이 JSON 파일 읽기

내 JSON 파일은 다음과 같다 :

내 SAS 코드는 다음과 같습니다
{ 
    "eventsLimited":false, 
    "events":[ 
    { 
     "_id":"1", 
     "userId":"1", 
     "timestamp":"2017-05-07T21:37:39.037Z", 
     "detailedEvents":[ 
     { 
      "eventType":"taskChanged", 
      "taskId":"111", 
      "changedProperties":[ 
      { 
       "property":"totalSecondsSpent", 
       "oldValue":0, 
       "newValue":3600 
      }, 
      { 
       "property":"totalSecondsEstimate", 
       "oldValue":0, 
       "newValue":144000 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     "_id":"2", 
     "userId":"1", 
     "timestamp":"2017-05-07T22:31:30.037Z", 
     "detailedEvents":[ 
     { 
      "eventType":"taskChanged", 
      "taskId":"111", 
      "changedProperties":[ 
      { 
       "property":"totalSecondsSpent", 
       "oldValue":3600, 
       "newValue":5400 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

:

Picture of my SAS output

을 :

data iHave; 
    infile 'C:\Users\MyUser\Desktop\MyJSONFile.txt' recfm=n dlm='{}[],'; 
    input value : $200. @@; 

    if value in: ('"count"' '"calls"') then 
     delete; 
run; 

libname iTest 'C:\Users\MyUser\Desktop'; 

data iTest.iTemp; 
    set iHave; 
    length name v $ 100; 

    if value =: '"_id"' then 
     n+1; 
    name=scan(value,2,'"','m'); 
    v=scan(value,-2,'"','m'); 
    drop value; 
run; 

이 나에게 다음과 같습니다 출력을 줄 것이다

지금까지 너무 좋아. 배열 안의 각 객체에 대해 카운터 (n)가 하나씩 증가하고 키와 값이 두 개의 다른 열에 표시됩니다.

제 문제는 changedProperties 배열 내부에있는 것을 얻지 못한다는 것입니다. 'oldValue'키와 'newValue'키의 두 값은 내 출력에 표시되지 않습니다. 예를 들어 첫 번째 newValue는 'v'열에서 3600이어야합니다.

아무도 내 코드를 고칠 수있는 방법을 알고 있으므로 출력을 제대로받을 수 있습니까? 문제는 숫자가 괄호 안에 표시되지 않고 스캔에서 괄호 안의 값으로 검색한다는 것입니다.

/크리스

답변

1

귀하의 문제는 당신이 지정하는 'm' 수정과, 단어를 큰 따옴표 (")로 구분하는 scan 기능을 말하고있다는 사실에서 오는 그 시작에서 연속 구분 기호뿐만 아니라 구분 기호 및 문자열의 끝을 차지하고 빈 단어를 나타냅니다. 첫 번째 scan 단어를 검색하기 때문에 다른 키/값 쌍 (즉, "key":"value")을 위해, 그것은 작동하는 동안

SO, 즉, 제 1 및 제 2 " 사이 key입니다 두 번째 scan는 단어를 뒤로 보이는 마지막과 최후의 사이 ", ie 가치; oldValuenewValue에 대해서는 값이 인용되지 않습니다. 즉, scan 함수가 동일한 단어, 즉 키를 찾습니다.

당신은 구분 기호는 콜론 (:) 인 것을 표시하여 그 문제를 해결하고있는 경우 따옴표를 제거 할 수 있습니다 :

여기 당신의 궁극적 인 목표는 표준 표 형식으로 데이터를 얻을 수있는 경우
name=dequote(scan(value,1,':','m')); 
v=dequote(scan(value,2,':','m')); 
+0

완벽! 완벽하게 이해합니다. 지금 일하고있어! 당신은 내 문제를 해결했습니다. 대단히 감사합니다 – crellee

+0

환영합니다. 그러나 스캔 기능의 두 번째 인수는 잘못되었습니다. 지금 고치다 – user2877959

+0

오, 그래. 코드를 잘 설명해 주었기 때문에 코드를 복사하지 않았습니다. 직접 작성했습니다. – crellee

0

JSON의 구조가 공유 한 스 니펫보다 너무 복잡하지는 않으므로 직접 가져 오기 위해 더 복잡한 단일 데이터 단계를 하드 코딩하는 것이 타당합니다.

예.

data example; 
infile cards dsd dlm='},' scanover; 
input 
    @'_id":' _id :8. 
    @'userId":' userId :8. 
    @'timestamp":' t_timestamp :$30. 
    @'eventType":' eventType :$30. 
    @'taskId":' taskId :8. 
; 
drop t_timestamp; 
timestamp = input(t_timestamp,is8601dt19.); 
format timestamp is8601dt.; 

do while(1); 
    input 
    @'property":' property :$30. 
    @'oldValue":' oldValue :8. 
    @'newValue":' newValue :8. 
    ; 
    output; 
    input @; 
    if not(index(_infile_,'},')) then leave; 
end; 
cards; 
{ 
    "eventsLimited":false, 
    "events":[ 
    { 
     "_id":"1", 
     "userId":"1", 
     "timestamp":"2017-05-07T21:37:39.037Z", 
     "detailedEvents":[ 
     { 
      "eventType":"taskChanged", 
      "taskId":"111", 
      "changedProperties":[ 
      { 
       "property":"totalSecondsSpent", 
       "oldValue":0, 
       "newValue":3600 
      }, 
      { 
       "property":"totalSecondsEstimate", 
       "oldValue":0, 
       "newValue":144000 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     "_id":"2", 
     "userId":"1", 
     "timestamp":"2017-05-07T22:31:30.037Z", 
     "detailedEvents":[ 
     { 
      "eventType":"taskChanged", 
      "taskId":"111", 
      "changedProperties":[ 
      { 
       "property":"totalSecondsSpent", 
       "oldValue":3600, 
       "newValue":5400 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 
; 
run; 
+0

당신은 내 목표가 맞습니다.하지만 불행히도 JSON은 더 복잡하고 거대합니다. 너무 많이 코딩하지 않을 것입니다. 하지만 내 문제에 대한 해결책이 마음에 든다. 그리고 감사합니다! – crellee