Передайте массив в каждый объект в файле JSON. (Proc JSON SAS) - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь экспортировать набор данных в файл 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": "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 голосов
/ 09 мая 2018

Существуют и другие методы вывода json, включая

  • излучатель с ручным кодированием в DATA Step
  • JSON-пакет в Proc DS2

Вот пример кодера с ручным кодированием для ваших данных и желаемого отображения.

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 =. Не рекомендуется путь для друзей.

0 голосов
/ 09 мая 2018

Вы можете попробовать объединить / сгруппировать текст перед вызовом proc json.

У меня нет proc json в моей среде SAS, но попробуйте этот шаг и убедитесь, что он работает для вас:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...