在SAS中导入单行json文件

在SAS中导入单行json文件,json,sas,Json,Sas,我有以下json格式的数据: {"metadata1":"val1","metadata2":"val2","data_rows":[{"var1":1,"var2":2,"var3":3},{"var1":4,"var2":5,"var3":6}]} 在开头有一些元数据变量,它们只出现一次,后面是多个数据记录,都在同一行上。如何将其导入SAS数据集 /*Create json file containing sample data*/ filename json "%sysfunc(path

我有以下json格式的数据:

{"metadata1":"val1","metadata2":"val2","data_rows":[{"var1":1,"var2":2,"var3":3},{"var1":4,"var2":5,"var3":6}]}
在开头有一些元数据变量,它们只出现一次,后面是多个数据记录,都在同一行上。如何将其导入SAS数据集

/*Create json file containing sample data*/
filename json "%sysfunc(pathname(work))\json.txt";
data _null_;
file json;
put '{"metadata1":"val1,","metadata2":"val2}","data_rows":[{"var1":1,"var2":2,"var3":3},{"var1":4,"var2":5,"var3":6}]}';
run;

/*Data step for importing the json file*/
data want;
infile json dsd dlm='},' lrecl = 1000000 n=1;
retain metadata1 metadata2;
if _n_ = 1 then input @'metadata1":' metadata1 :$8. @'metadata2":' metadata2 :$8. @;
input @'var1":' var1 :8. @'var2":' var2 :8. @'var3":' var3 :8. @@;
run;
注:

  • SAS开始读取每个变量的点是使用
    @'string'
    逻辑设置的
  • }
    设置为分隔符,并在输入语句上使用
    格式修饰符,告诉SAS保持从指定的起点读取字符,直到读取请求的最大数字或达到分隔符为止
  • 在infle语句上设置
    dsd
    ,将从字符数据值中删除双引号,并防止在字符变量包含分隔符时出现任何问题
  • 双尾随
    @
    告诉SAS继续使用相同的逻辑从同一行读取更多记录,直到它到达行的末尾
  • 元数据变量作为特例使用单独的输入语句进行处理。如果需要,可以很容易地将它们转移到单独文件中的一行
  • lrecl
    需要大于或等于文件的长度才能使用此方法
  • 设置
    n=1
    可以防止SAS尝试缓冲多个输入行,从而有助于减少文件非常大时的内存使用

嗯。我不确定这与我的想法是否有足够的不同。我认为大多数JSON文件在技术上都是单行的(我认为,不管行数多少,只要稍加修改,解决方案都可以正常工作)。我同意这一点,但我认为现有的JSON问题都没有解决读取metatdata记录或每行多个记录的问题。我还想证明,不使用
scan
就可以做这类事情。我想我看到了元数据记录的不同,尽管我不确定您的示例在这方面是否真的有那么好-您是否可以改进它:重新阅读它们,或者自动阅读?否则,“不使用扫描”位,也许您可以回答有关链接的问题。我认为这个问题/答案总体上还是有用得多的(考虑到多种方法——我认为之前还有另外一种方法也有几个例子)。特别是,这里有一个“假”json文件——如果有一个真实的示例会更好。或者至少有一个看起来像真实的示例。我最近遇到了一个具有这种精确结构的json文件——只有变量名和值被更改了。