2017-11-02 2 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)は1だけインクリメントされ、キーと値は2つの異なる列に表示されます。

私の問題は、私がchangedProperties配列の内側にあるものを取得しないということです。 'oldValue'キーと 'newValue'キーの2つの値は私の出力には表示されません。 たとえば、最初のnewValueは 'v'列の3600でなければなりません。

私のコードを修正する方法を知っている人はいますか? 問題は、数字が括弧内に表示されず、スキャンで括弧内の値で検索されるということです。

/クリス・

答えて

1

あなたの問題は、起動時にその連続した区切り文字だけでなく、区切り文字を指定する'm'修飾子で、単語は、二重引用符(")で区切られscan機能を語っているという事実に由来し、文字列の終わりが考慮され、空の単語が示されます。 SO

、最初scan"第一及び第二の間にある単語、すなわちkeyを探し、二scanは、単語を後方に見えるので、それは動作しますが、あなたの他のキー/値ペア(すなわち、"key":"value")のためにしながら、最後と前夜の間に、"、すなわち値; oldValuenewValueの場合、値は引用されません。つまり、scan関数は同じ単語、つまりキーを検索します。

あなたは区切り文字はコロン(:)であることを示すことによってそれを修正し、もしあれば、引用符を削除することができます:

ここにあなたの究極の目標は、標準的な表形式にデータを取得する場合
name=dequote(scan(value,1,':','m')); 
v=dequote(scan(value,2,':','m')); 
+0

パーフェクト!完璧な意味合いを持つ。それは今働いている!あなたは私の問題を解決しました。どうもありがとうございます – crellee

+0

ようこそ。スキャン機能の第2引数は間違っていました。今すぐ固定 – 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

関連する問題