楼主: Silon.Jon
11302 14

[问答] 牛人入,“sas 怎么读取Json格式文件” [推广有奖]

  • 7关注
  • 0粉丝

本科生

46%

还不是VIP/贵宾

-

威望
0
论坛币
1281 个
通用积分
0.0002
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2615 点
帖子
89
精华
0
在线时间
67 小时
注册时间
2012-9-12
最后登录
2015-5-1

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
Json的结构不是太复杂,最多嵌套4层,目的是解析完存入数据集,问题是有没有对应的proc或是函数类似hive里getjson之类的?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:json son Hive 数据集 ROC

本帖被以下文库推荐

沙发
zhengbo8 发表于 2013-12-26 12:22:02 |只看作者 |坛友微信交流群
Json的数据文件,来个实例的数据。

使用道具

藤椅
zhou.wen 发表于 2013-12-26 13:43:57 |只看作者 |坛友微信交流群
if you use the sas9.4,you can try the follow proc json
proc json out="C:\Users\sasabc\JSON\DefaultOutput.json";
   export sashelp.class;
run;

otherwise.
you may need to  conver the JSON object into a XML document,and then use the XML Libname  engine to read it.
Practice Is The Best Teacher!

使用道具

板凳
zhou.wen 发表于 2013-12-26 14:06:50 |只看作者 |坛友微信交流群
example:data.json
  1. {
  2.     {
  3.          "id":"John" ,
  4.          "password":"Doe"
  5.     },
  6.    
  7. {
  8.          "id":"Ben" ,
  9.          "password":"123"
  10.     }
  11. }
复制代码
%macro JSONParse(Filename, varList);
data JSON (keep=&varlist record);
    infile &FILENAME ;
    input;
    ExpressionID = prxparse('/{(.*?)}/');
    jsontext = _INFILE_;
    start = 1;
    stop = length(jsontext);

    array vlist $50 &Varlist;

   call prxnext(ExpressionID, start, stop, jsontext, position, length);

    do while (position > 0);
        newpos = position + 1;
        newlen = length - 2;
        record = substr(jsontext, newpos, newlen);

        i=0;   
        do over vlist;
            i+1;
            vlist = strip(compress(scan(scan( record, i, ","), 2, ":"), '"'));
        end;

        output;
        call prxnext(ExpressionID, start, stop, jsontext, position, length);
    end;
run;
%mend;


FILENAME TEST "\data.json";
%JSONParse(TEST, id password);
已有 1 人评分论坛币 收起 理由
admin_kefu + 100 热心帮助其他会员

总评分: 论坛币 + 100   查看全部评分

Practice Is The Best Teacher!

使用道具

报纸
Silon.Jon 发表于 2014-1-13 15:49:37 |只看作者 |坛友微信交流群
zhou.wen 发表于 2013-12-26 14:06
example:data.json%macro JSONParse(Filename, varList);
data JSON (keep=&varlist record);
    infile ...
太神奇了,虽然没看懂,但是有路走心里就踏实了,拜你为师啊!!!

使用道具

地板
Silon.Jon 发表于 2014-1-13 15:54:31 |只看作者 |坛友微信交流群
zhou.wen 发表于 2013-12-26 13:43
if you use the sas9.4,you can try the follow proc json
proc json out="C:\Users\sasabc\JSON\DefaultO ...
今天遇到联mysql的问题,回了一个你之前的帖,我用ODBC倒是能连了,可是如果能直接连mysql还是希望直连。

使用道具

7
luekemia 发表于 2015-1-22 16:06:05 |只看作者 |坛友微信交流群
zhou.wen 发表于 2013-12-26 14:06
example:data.json%macro JSONParse(Filename, varList);
data JSON (keep=&varlist record);
    infile ...
zhou.wen 好牛,居然简单几句就解决了。
很好用,不过有个小问题,就是实际应用中Json有变量缺失的情况:
  1. {"id":1,"V1":"我应该是第1行第1个变量"},
  2. {"id":2,"V2":"我应该是第2行第2个变量"},
  3. {"id":3,"V3":"我应该是第3行第3个变量"}
复制代码

如果变量全且顺序排列,用zhou.wen的程序没有问题,斗胆稍微改一下,解决变量缺失情况下的错位问题:


  1. %macro JSONParse(Filename, varList);
  2. data JSON (keep=&varlist record);
  3.     infile &FILENAME lrecl=10000 ;
  4.     input;
  5.     ExpressionID = prxparse('/{(.*?)}/');
  6.     jsontext = _INFILE_;
  7.     start = 1;
  8.     stop = length(jsontext);

  9.     array vlist $50 &Varlist;

  10.    call prxnext(ExpressionID, start, stop, jsontext, position, length);

  11.     do while (position > 0);
  12.         newpos = position + 1;
  13.         newlen = length - 2;
  14.         record = substr(jsontext, newpos, newlen);

  15.         i=0;   
  16.         do over vlist;
  17.             i+1;
  18. /*            vlist = strip(compress(scan(scan( record, i, ","), 2, ":"), '"'));*/
  19. select ( upcase(strip(compress(scan(scan( record, i, ","), 1, ":"), '"'))) );
  20.                                 %let i=1;
  21.                                 %do %until (%scan(&varList.,&i.)=);
  22.                                 %let v=%scan(&varList.,&i.);
  23.                                   when (upcase("&v.")) &v.= strip(compress(scan(scan( record, i, ","), 2, ":"), '"'));
  24.                                 %let i=%eval(&i.+1);
  25.                                 %end;
  26.                                 otherwise put 'PROBLEM OBSERVATION';
  27.                          end;
  28.         end;

  29.         output;
  30.         call prxnext(ExpressionID, start, stop, jsontext, position, length);
  31.     end;
  32.         drop record;
  33. run;
  34. %mend;
复制代码
这样结果就不会错位了
result.PNG

使用道具

8
bitcoin 发表于 2016-2-19 22:05:05 |只看作者 |坛友微信交流群
用proc json可以实现

使用道具

9
wodematlab 发表于 2016-8-8 14:11:48 |只看作者 |坛友微信交流群
proc json具体方法是啥呢,我sas数据集里有一列就是json格式的,如果分裂出来

使用道具

10
wodematlab 发表于 2016-8-8 14:29:22 |只看作者 |坛友微信交流群
luekemia 发表于 2015-1-22 16:06
zhou.wen 好牛,居然简单几句就解决了。
很好用,不过有个小问题,就是实际应用中Json有变量缺失的情况: ...
大神,varlist具体什么含义呢?
when (upcase("&v.")) &v.= strip(compress(scan(scan( record, i, ","), 2, ":"), '"'));
这段不知道什么意思?

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 08:49