将数组传递到JSON文件中的每个对象。 (Proc JSON SAS)

时间:2018-05-09 08:32:02

标签: arrays json sas

我尝试将数据集导出到JSON文件。使用PROC JSON,我的数据集中的每一行都可以很好地导出。 我想要做的是使用来自特定列的数据向每个导出的对象添加一个数组。

我的数据集的结构如下:

data test;
input id $ amount $ dimension $;
datalines;
1 x A
1 x B
1 x C
2 y A
2 y X
3 z C
3 z K
3 z X
;
run; 

proc json out='/MYPATH/jsontest.json' pretty nosastags; 
     export test; 
run;

显然,导出的JSON对象看起来像这样:

[
  {
    "id": "1",
    "amount": "x",
    "dimension": "A"
  },
  {
    "id": "1",
    "amount": "x",
    "dimension": "B"
  },
  {
    "id": "1",
    "amount": "x",
    "dimension": "C"
  },
...]

我想要的结果:

对于每个id,我想将维度列中的所有数据插入到数组中,因此我的输出将看起来像这样:

[
  {
    "id": "1",
    "amount": "x",
    "dimensions": [
      "A",
      "B",
      "C"
    ]
  },
  {
    "id": "2",
    "amount": "y",
    "dimensions": [
      "A",
      "X"
    ]
  },
  {
    "id": "3",
    "amount": "z",
    "dimensions": [
      "C",
      "K",
      "X"
    ]
  }
]

我找不到像这样的情景或一些如何解决问题的指导方针。我希望有人可以提供帮助。

/ Crellee

2 个答案:

答案 0 :(得分:1)

您可以在致电proc json之前尝试连接/分组文字。

我的SAS环境中没有proc json,但请尝试此步骤,看看它是否适合您:

data want;
set test (rename=(dimension=old_dimension));
Length dimension $200. ;
retain dimension ;
by id    amount   notsorted;
if first.amount = 1 then do; dimension=''; end;
if last.amount = 1 then do; dimension=catx(',',dimension,old_dimension);  output; end;
else do; dimension=catx(',',dimension,old_dimension); end;
drop old_dimension;
run;

输出:

id=1 amount=x dimension=A,B,C 
id=2 amount=y dimension=A,X 
id=3 amount=z dimension=C,K,X

答案 1 :(得分:1)

json输出还有其他方法,包括

  • DATA Step
  • 中的手动编码发射器
  • Proc DS2中的JSON包

以下是用于数据和所需映射的手动编码发射器的示例。

data _null_;
  file 'c:\temp\test.json';

  put '[';

  do group_counter = 1 by 1 while (not end_of_data);
    if group_counter > 1 then put @2  ',';
    put @2 '{';
    do dimension_counter = 1 by 1 until (last.amount);
      set test end=end_of_data;
      by id amount;
      if dimension_counter = 1 then do;
        q1 = quote(trim(id));
        q2 = quote(trim(amount));
        put 
          @4 '"id":' q1 "," 
        / @4 '"amount":' q1 "," 
        ;
        put @4 '"dimensions":' / @4 '[';
      end;
      else do;
        put @6 ',' @;
      end;
      q3 = quote(trim(dimension));
      put @8 q3;
    end;
    if dimension_counter > 1 then put @4 '}';
    put @2 ']';
  end;

  put ']';

  stop;
run;

这样的发射器可以被宏观化和推广以处理data =,by =和arrayify =的规范。不是推荐给朋友的路径。