2024年5月1日水曜日

階層構造をもったjsonをSASに読み込む話

 少し前(2019年は"少し"前です)のSASユーザー会で、jsonに対応したLibnameステートメントを使って単階層のJSONをSASに読み込む内容の発表がありました。…そういえば複数階層を持つjsonをSASで読み込むとどうなるのかって気になりますよね。私はなりました。時間が空いていますがちょっと調べたので記事にします。件のSASユーザー会の資料は何となく怖いのでリンクしません。「JSONという奇妙な拡張子とSAS」で調べてみてください。HITすると良いんですが。

用意したのは以下の構造のjsonです。このブログは容赦なくベタ張りするのでスクロールが大変ですね。すみません。改善する気は今のところありません。例えばid:1は子階層childrenを持っています。

{

  "id": "1",
  "name": "root",
  "children": [
    {
      "id": "2",
      "name": "child1",
      "Detail": [
        {
          "id": "3",
          "name": "grandchild1",
          "items": [{"itemID": "1A", "itemprice": 280}]
        },
        {
          "id": "4",
          "name": "grandchild2",
          "items": []
        }
      ]
    },
    {
      "id": "5",
      "name": "child2",
      "Detail": [
        {
          "id": "6",
          "name": "grandchild3",
          "items": [{"itemID": "1B", "itemprice": 500}]
        }
      ]
    }
  ]
}

これをSAS以下のプログラムでSASに読み込みます。encodingをutf-8にしているのは何となくです。このデータはシングルバイトのみなので違いはありません。

filename TG "piyopiyo\Hierarchy.json" encoding="utf-8" ;

libname IN json fileref = TG ;

proc copy in = IN out = WORK ; run ;

libname IN clear ;

読み込むと以下の通りAllData、Children、Children_detail、Detal_items、rootのデータセットになります。


それぞれが各階層のデータに対応していますが、階層間のつながりはAllDataを見ればわかるようになっています。各階層が縦に積まれているので、実際には転置したほうが使いやすいかもしれません。

以下の画像はAlldataデータセットの内容で、例えば1階層目にはidが1、NameがRoot、子階層としてChildrenを持っていて、2階層目のChildrenはidが2、nameがchild1で子階層(1階層目から見たら孫階層)としてDetailを持っている、ことなどがわかります。

Libnameでとりあえず読み込んだだけにしては階層の情報も含めていい感じに取得できていると思います。SASが自動で作成するmapファイルもなかなかのもんじゃないですか。



0 件のコメント:

コメントを投稿