2014-10-10 3 views
3

SAS에서 JSON 파일의 데이터를 구문 분석하려고하는데 코드에 문제가 있습니다. 너무 길기 때문에 모든 JSON 콘텐츠를 게시 할 수는 없지만 관련성이있는 JSON 콘텐츠의 일부를 게시 할 수 있습니다. 아래는 나의 SAS 코드입니다. 내가 그것을 실행할 때, 나는 "잃어버린 카드"를 말하는 로그에 뭔가를 얻는다. 그리고 나는 그것이 무엇을 의미하는지 모른다.SAS에서 JSON 출력을 읽는 중 문제가 발생했습니다.

코드의 일부가 주석 처리됩니다. 왜냐하면 변수 목록을 추가로 작성할 때까지 코드가 실제로 작동하기 때문입니다.이 오류 ("LOST CARD")는 "lrecl "선과 특정 변수의 길이?

제공 할 수있는 도움에 대해 미리 감사드립니다.

SAS 코드 :

filename otp1 '...\output\otp1.json'; 

data work.otp1sas; 
infile otp1 lrecl = 32000 /*truncover*/ scanover; 
input 

@'"startTime":' startTime $20. 
@'"endTime":' endTime $20. 
@'"walkTime":' walkTime $20. 
@'"transitTime":' transitTime $20. 
/*@'"waitingTime":' waitingTime $20. 
@'"walkDistance":' walkDistance $20. 
@'"walkLimitExceeded":' walkLimitExceeded $20. 
@'"transfers":' transfers $20.*/; 

startTime = scan(startTime,1,',"'); 
endTime = scan(endTime,1,',"'); 
walkTime = scan(walkTime,1,',"'); 
transitTime = scan(transitTime,1,',"'); 
/*waitingTime = scan(waitingTime,1,',"'); 
walkDistance = scan(walkDistance,1,',"'); 
walkLimitExceeded = scan(walkLimitExceeded,1,',"'); 
transfers = scan(transfers,1,',"');*/ 

run; 

JSON 콘텐츠 (즉, 위의 코드 관련이) : 당신은 SAS 9.3+을 충분히 luccy하지 않는 경우

{"requestParameters":{"date":"03-14-2014","mode":"TRANSIT,WALK","arriveBy":"false","showIntermediateStops":"false","fromPlace":"33.8134605,-84.34973148","itinIndex":"0","toPlace":"33.80882004,-84.39769799","time":"10:00am","maxWalkDistance":"3218.688"},"plan":{"date":1394805600000,"from":{"name":"Arlington Avenue Northeast","stopId":null,"stopCode":null,"platformCode":null,"lon":-84.34880165944314,"lat":33.81255118156955,"arrival":null,"departure":null,"orig":null,"zoneId":null,"stopIndex":null},"to":{"name":"Collier Road Northwest","stopId":null,"stopCode":null,"platformCode":null,"lon":-84.39787235641106,"lat":33.808417712941896,"arrival":null,"departure":null,"orig":null,"zoneId":null,"stopIndex":null},"itineraries":[{"duration":2630.0,"startTime":1394806613000,"endTime":1394809243000,"walkTime":994,"transitTime":1273,"waitingTime":363,"walkDistance":1280.0733818655874,"walkLimitExceeded":false,"elevationLost":0.0,"elevationGained":0.0,"transfers":2," 
+0

SAS는 현재 행에서 더 많은 데이터를 예상하지만 행이 끝납니다. TRUNCOVER를 사용하지 않는 이유는 무엇입니까? 아마도 도움이 될 것입니다. http://www2.sas.com/proceedings/sugi30/058-30.pdf – vasja

+4

현재 사용중인 SAS 버전은 무엇입니까? 9.3 이상이면 Proc Groovy를 사용하여 JSON 파일을 구문 분석 할 수 있습니다. – Reeza

+0

리스, 고마워. JSON 파일 컨텐트를 SAS에서 사용할 수있는 것으로 변환하는 것에 익숙하지 않은 분께는 사용하기가 비교적 쉽습니다. 나는 그 옵션을 고려할 수 있습니다 ... – emorystudent

답변

0

, 다음

을 사용할 수 있습니다
filename otp1 '...\output\otp1.json'; 

data work.otp1sas; 
    format 
     equation $60. 
     variable $32. 
     value $32. 

     startTime $20. 
     endTime $20. 
     walkTime $20. 
     transitTime $20. 
     waitingTime $20. 
     walkDistance $20. 
     walkLimitExceeded $20. 
     transfers $20.; 

    ** read the JSON and isolate the relevant object **; 
    infile otp1 lrecl = 32000 truncover ; 
    input @'"itineraries":[' jsonArray $32000.; 
    jsonArray = scan(jsonArray, 1, ']'); 

    ** separate the objects **; 
    do objNr = 1 to countw(jsonArray, '}{'); 
     jsonObject = strip(scan(jsonArray, objNr, '}{')); 

     ** separate the equations **; 
     do varNr = 1 to countw(jsonObject, ','); 
      equation = strip(scan(jsonObject, varNr, ',')); 
      variable = scan(equation, 1, '"'); 
      value = substr(equation, index(equation, ':') + 1); 

      ** handle cases where a string value contains a comma **; 
      do while (varNr LT countw(jsonObject,',') 
      and substr(value, 1, 1) EQ '"' 
      and substr(value, length(value), 1) NE '"'); 
       varNr = varNr + 1; 
       value = trim(value) ||','|| strip(scan(jsonObject, varNr, ',')); 
      end; 

      select (variable); 
       when ('startTime')   startTime   = dequote(value); 
       when ('endTime')   endTime   = dequote(value); 
       when ('walkTime')   walkTime   = dequote(value); 
       when ('transitTime')  transitTime  = dequote(value); 
       when ('waitingTime')  waitingTime  = dequote(value); 
       when ('walkDistance')  walkDistance  = dequote(value); 
       when ('walkLimitExceeded') walkLimitExceeded = dequote(value); 
       when ('transfer')   transfer   = dequote(value); 
       otherwise put varNr= variable= value=; 
      end; 
     end; 
     if countw(jsonObject, ',') GT 1 then output; 
    end; 
run; 
0

SAS 9.4에는 처리 용 Proc DS2 솔루션이 있습니다. Json

+0

보다 구체적이고 가능한 경우 설명하십시오. – WitVault

관련 문제