<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Parsing JSON stored under a Data set Column in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334560#M75572</link>
    <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt;&amp;nbsp;I understood&amp;nbsp;differently: " unsure how to deal with multiple metric data rollover to separate rows of data."&lt;/P&gt;
&lt;P&gt;The code works either way. &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;</description>
    <pubDate>Tue, 21 Feb 2017 04:48:23 GMT</pubDate>
    <dc:creator>ChrisNZ</dc:creator>
    <dc:date>2017-02-21T04:48:23Z</dc:date>
    <item>
      <title>Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334505#M75547</link>
      <description>&lt;P&gt;Hi All,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I need to work with JSON data that is&amp;nbsp;stored as a JSONB data type from the source POSTGRES table.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Below snapshot of the dataset details the JSON data under the 'data' column.&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;company_id	data
6066	        {'gw': {'date': '2015-12-31', 'currency': 'USD', 'value': 32021}, 'do': {'date': '2015-12-31', 'currency': 'USD', 'value': 71}}&lt;/PRE&gt;&lt;P&gt;Desired output is to transform the dataset to the below form.&lt;/P&gt;&lt;PRE&gt;company_id	metric	date	        currency	value
6066	        gw	2015-12-31	USD	        32021
6066	        do	2015-12-31	USD	        71&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The contents under the JSON string are pretty long extending to 1000's of metrics, and the dataset is large that it makes converting back to JSON and parsing it is cumbersome.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;a. With the JSON data that needs parsing in a dataset, is there an option of still using INFILE and/or LIBNAME JSON feasible?&lt;/P&gt;&lt;P&gt;b. Tried parsing the string with CALL SCAN position parameters, but, unsure how to deal with multiple metric data rollover to separate rows of data.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Any pointers on the approach to follow would be very helpful. Thank you!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 20 Feb 2017 23:27:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334505#M75547</guid>
      <dc:creator>sarav1981</dc:creator>
      <dc:date>2017-02-20T23:27:56Z</dc:date>
    </item>
    <item>
      <title>Re: Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334520#M75551</link>
      <description>&lt;P&gt;In your example, how would the JSON parser know the second variable is named METRIC?&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Also, are you saying that your parser needs to look at quoted content to see whether it is a date value?&lt;/P&gt;</description>
      <pubDate>Tue, 21 Feb 2017 01:41:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334520#M75551</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2017-02-21T01:41:50Z</dc:date>
    </item>
    <item>
      <title>Re: Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334521#M75552</link>
      <description>&lt;P&gt;Like this?&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data HAVE;
  COMPANY_ID= '6066 ';                                    
  DATA= "{'gw': {'date': '2015-12-31', 'currency': 'USD',"; output;
  DATA= "'value': 32021}, 'do': {'date': '2015-12-31',   "; output;
  DATA= " 'currency': 'USD', 'value': 71}}               "; output;
  COMPANY_ID= '6067 ';                                    
  DATA= "{'gw': {'date': '2015-12-31', 'currency': 'NZD',"; output;
  DATA= "'value': 32022}, 'do': {'date': '2015-12-31',   "; output;
  DATA= " 'currency': 'NZD', 'value': 72}}               "; output;
run;

data WANT;
  retain COMPANY_ID METRIC DATE CURRENCY VALUE PRX;
  length METRIC DATE CURRENCY VALUE WORD1 WORD2 $16;
  keep COMPANY_ID METRIC DATE CURRENCY VALUE;
  if _N_=1 then PRX=prxparse("/'.*?':( '.*?')?/");
  STARTPOS=1;
  set HAVE;
  do until (POS=0);
    call prxnext(PRX, STARTPOS, -1, DATA, POS, LEN); 
    if POS then do;
      WORD1= scan(substr(DATA,POS),1,"{}': ") ;
      WORD2= scan(substr(DATA,POS),2,"{}': ") ;
      select(WORD1);
        when( 'date'     ) DATE    =WORD2;
        when( 'currency' ) CURRENCY=WORD2;
        when( 'value'    ) VALUE   =WORD2;
        otherwise          METRIC  =WORD1;
      end;
    end;
    if VALUE ne '' then do;
      output;
      call missing( METRIC, DATE, CURRENCY, VALUE );
    end;
  end;
run;
proc print data=WANT noobs;
run; 
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV class="branch"&gt;
&lt;DIV&gt;
&lt;DIV align="left"&gt;
&lt;TABLE class="table" summary="Procedure Print: Data Set WORK.WANT" frame="box" rules="all" cellpadding="5" cellspacing="0"&gt;&lt;COLGROUP&gt; &lt;COL /&gt; &lt;COL /&gt; &lt;COL /&gt; &lt;COL /&gt; &lt;COL /&gt;&lt;/COLGROUP&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH class="l header" scope="col"&gt;COMPANY_ID&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;METRIC&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;DATE&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;CURRENCY&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;VALUE&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;6066&lt;/TD&gt;
&lt;TD class="l data"&gt;gw&lt;/TD&gt;
&lt;TD class="l data"&gt;2015-12-31&lt;/TD&gt;
&lt;TD class="l data"&gt;USD&lt;/TD&gt;
&lt;TD class="l data"&gt;32021&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;6066&lt;/TD&gt;
&lt;TD class="l data"&gt;do&lt;/TD&gt;
&lt;TD class="l data"&gt;2015-12-31&lt;/TD&gt;
&lt;TD class="l data"&gt;USD&lt;/TD&gt;
&lt;TD class="l data"&gt;71&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;6067&lt;/TD&gt;
&lt;TD class="l data"&gt;gw&lt;/TD&gt;
&lt;TD class="l data"&gt;2015-12-31&lt;/TD&gt;
&lt;TD class="l data"&gt;NZD&lt;/TD&gt;
&lt;TD class="l data"&gt;32022&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;6067&lt;/TD&gt;
&lt;TD class="l data"&gt;do&lt;/TD&gt;
&lt;TD class="l data"&gt;2015-12-31&lt;/TD&gt;
&lt;TD class="l data"&gt;NZD&lt;/TD&gt;
&lt;TD class="l data"&gt;72&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 21 Feb 2017 01:50:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334521#M75552</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2017-02-21T01:50:15Z</dc:date>
    </item>
    <item>
      <title>Re: Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334522#M75553</link>
      <description>Thank you for checking mkeintz.&lt;BR /&gt;&lt;BR /&gt;Naming the parsed value columns is not critical at the first pass. Named the METRIC column, so as to show it as a field to be parsed (1st position within the JSON).&lt;BR /&gt;Same goes for the DATE field stored as a string. Identifying that the 2nd position within JSON is a date stored as string, I can then apply the relevant format.</description>
      <pubDate>Tue, 21 Feb 2017 01:49:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334522#M75553</guid>
      <dc:creator>sarav1981</dc:creator>
      <dc:date>2017-02-21T01:49:55Z</dc:date>
    </item>
    <item>
      <title>Re: Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334523#M75554</link>
      <description>&lt;P&gt;Apparently there is now a JSON engine for the libname statement.&amp;nbsp; See:&amp;nbsp;&lt;A href="https://communities.sas.com/t5/Base-SAS-Programming/Reading-JSON/m-p/30036#M5703" target="_self"&gt;Reading JSON&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 21 Feb 2017 01:53:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334523#M75554</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2017-02-21T01:53:23Z</dc:date>
    </item>
    <item>
      <title>Re: Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334544#M75563</link>
      <description>&lt;PRE&gt;

data x;
company_id=6066;
data="{'gw': {'date': '2015-12-31', 'currency': 'USD', 'value': 32021}, 'do': {'date': '2015-12-31', 'currency': 'USD', 'value': 71}}";
output;
run;
data temp;
 set x;
 do i=1 to countw(data,'{}[],:');
  temp=dequote(strip(scan(data,i,'{}[],:')));output;
 end;
drop data;
run;

data temp1;
 merge temp temp(firstobs=2 keep=temp company_id 
 rename=(temp=_temp company_id=_id));
 if (missing(_temp) and company_id=_id) or 
 temp in ('date' 'currency' 'value');
 drop _id;
run;
data temp2;
 set temp1;
 length metric $ 40;
 retain metric;
 if missing(_temp) then do;metric=temp;delete;end;
 drop i;
run;
proc transpose data=temp2 out=want;
by company_id metric notsorted;
var _temp;
id temp;
run;


&lt;/PRE&gt;</description>
      <pubDate>Tue, 21 Feb 2017 03:24:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334544#M75563</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2017-02-21T03:24:01Z</dc:date>
    </item>
    <item>
      <title>Re: Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334549#M75567</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt; If there is too much data for exporting to a flat file, I suspect creating 3 intermediate tables is not an option either.&lt;/P&gt;
&lt;P&gt;Here is a way -similar to yours, where we create a suite of values in one column- to do it in one step (I don't see why the view should create a spill file, but I don't know. Is there a way to know?)&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data HAVE;
  COMPANY_ID= '6066 ';                                    
  DATA= "{'gw': {'date': '2015-12-31', 'currency': 'USD',"; output;
  DATA= "'value': 32021}, 'do': {'date': '2015-12-31',   "; output;
  DATA= " 'currency': 'USD', 'value': 71}}               "; output;
  COMPANY_ID= '6067 ';                                    
  DATA= "{'gw': {'date': '2015-12-31', 'currency': 'NZD',"; output;
  DATA= "'value': 32022}, 'do': {'date': '2015-12-31',   "; output;
  DATA= " 'currency': 'NZD', 'value': 72}}               "; output;
run;

data _V/view=_V;
  set HAVE;
  length STR $16;
  keep COMPANY_ID STR;
  do I=1 to 1e9 until (STR=' ');
    STR=scan(DATA, I, "{}':, ") ;
    if STR ne ' ' then output;
  end;
run;

data WANT; 
  retain COMPANY_ID METRIC DATE CURRENCY ;
  keep   COMPANY_ID METRIC DATE CURRENCY VALUE;
  set _V;
  if ^SKIP_METRIC then METRIC  =STR;
  select(lag(STR));
    when( 'date'     ) DATE    =STR;
    when( 'currency' ) CURRENCY=STR;
    when( 'value'    ) VALUE   =STR;
    otherwise         ;
  end;                   
  if VALUE ne ' ' then do;
    output;
    SKIP_METRIC=0;
  end;
  else SKIP_METRIC+1;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="branch"&gt;
&lt;DIV&gt;
&lt;DIV align="left"&gt;
&lt;TABLE class="table" summary="Procedure Print: Data Set WORK.WANT" frame="box" rules="all" cellpadding="5" cellspacing="0"&gt;&lt;COLGROUP&gt; &lt;COL /&gt; &lt;COL /&gt; &lt;COL /&gt; &lt;COL /&gt; &lt;COL /&gt;&lt;/COLGROUP&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH class="l header" scope="col"&gt;COMPANY_ID&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;METRIC&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;DATE&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;CURRENCY&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;VALUE&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;6066&lt;/TD&gt;
&lt;TD class="l data"&gt;gw&lt;/TD&gt;
&lt;TD class="l data"&gt;2015-12-31&lt;/TD&gt;
&lt;TD class="l data"&gt;USD&lt;/TD&gt;
&lt;TD class="l data"&gt;32021&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;6066&lt;/TD&gt;
&lt;TD class="l data"&gt;do&lt;/TD&gt;
&lt;TD class="l data"&gt;2015-12-31&lt;/TD&gt;
&lt;TD class="l data"&gt;USD&lt;/TD&gt;
&lt;TD class="l data"&gt;71&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;6067&lt;/TD&gt;
&lt;TD class="l data"&gt;gw&lt;/TD&gt;
&lt;TD class="l data"&gt;2015-12-31&lt;/TD&gt;
&lt;TD class="l data"&gt;NZD&lt;/TD&gt;
&lt;TD class="l data"&gt;32022&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;6067&lt;/TD&gt;
&lt;TD class="l data"&gt;do&lt;/TD&gt;
&lt;TD class="l data"&gt;2015-12-31&lt;/TD&gt;
&lt;TD class="l data"&gt;NZD&lt;/TD&gt;
&lt;TD class="l data"&gt;72&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 21 Feb 2017 03:57:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334549#M75567</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2017-02-21T03:57:19Z</dc:date>
    </item>
    <item>
      <title>Re: Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334557#M75569</link>
      <description>&lt;P&gt;Chris,&lt;/P&gt;
&lt;P&gt;I don't know either.&lt;/P&gt;
&lt;P&gt;OP said the whole json string is in a variable named DATA, not like your data step did .&lt;/P&gt;</description>
      <pubDate>Tue, 21 Feb 2017 04:29:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334557#M75569</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2017-02-21T04:29:36Z</dc:date>
    </item>
    <item>
      <title>Re: Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334560#M75572</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt;&amp;nbsp;I understood&amp;nbsp;differently: " unsure how to deal with multiple metric data rollover to separate rows of data."&lt;/P&gt;
&lt;P&gt;The code works either way. &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 21 Feb 2017 04:48:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/334560#M75572</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2017-02-21T04:48:23Z</dc:date>
    </item>
    <item>
      <title>Re: Parsing JSON stored under a Data set Column</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/572609#M161610</link>
      <description>&lt;P&gt;Hi Sarav,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have a similar requirement where I need to extract json data (hundreds of columns; big string)&amp;nbsp;from a column in a table. Json is stored in a column in a table. Can you please share how you achieved it?&lt;/P&gt;</description>
      <pubDate>Thu, 11 Jul 2019 05:05:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Parsing-JSON-stored-under-a-Data-set-Column/m-p/572609#M161610</guid>
      <dc:creator>vinaybatra</dc:creator>
      <dc:date>2019-07-11T05:05:33Z</dc:date>
    </item>
  </channel>
</rss>

