2014-10-10 173 views
3

我想從SAS中的JSON文件解析出數據,但在代碼中卡住了。我無法發佈所有的JSON內容,因爲它太長了,但我可以發佈相關的部分內容。以下是我的SAS代碼;當我運行它的時候,我在日誌中寫到「LOST CARD」,我不確定這是什麼意思。無法讀取SAS中的JSON輸出

代碼的一部分被註釋掉,因爲代碼實際上工作,直到我進一步在我的變量列表中......我想知道......這個錯誤(「失卡」)有一些與「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內容(這是有關上面的代碼):

{"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 2014-10-10 18:13:17

+4

你在什麼版本的SAS?如果您使用的是9.3+,則可以使用Proc Groovy來幫助解析JSON文件。 – Reeza 2014-10-10 18:46:19

+0

里斯,謝謝。對於不熟悉將JSON文件內容轉換爲SAS中可用內容的人員來說,使用相對容易嗎?我可能會考慮這個選項...... – emorystudent 2014-10-10 19:00:10

回答

0

如果不luccy足有SAS 9.3+,您可以使用以下

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擁有用於處理Json的Proc DS2解決方案

+0

請更具體,並儘可能解釋。 – WitVault 2016-02-19 08:04:47