<?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: XML to SAS Parallel importing/parsing/copying in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/XML-to-SAS-Parallel-importing-parsing-copying/m-p/475225#M122187</link>
    <description>&lt;P&gt;Hi Thank you for your response.&lt;/P&gt;&lt;P&gt;Yes I actually include the code to generate the map file for each record and use the map file to read in the xml.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;FileName mapfile&amp;nbsp; "C:\XML\XMLROW3\xmlrowx3.map";run;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; FileName testfile "C:\XML\XMLROW3\xmlrowx3.xml" ;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Libname testfile xmlv2 xmlmap=mapfile auTomap=replace;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The processing time increases during the Append step as the file grows for each iteration. If I can place that part in the Parallel processing alone might help.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 03 Jul 2018 15:11:56 GMT</pubDate>
    <dc:creator>SK4</dc:creator>
    <dc:date>2018-07-03T15:11:56Z</dc:date>
    <item>
      <title>XML to SAS Parallel importing/parsing/copying</title>
      <link>https://communities.sas.com/t5/SAS-Programming/XML-to-SAS-Parallel-importing-parsing-copying/m-p/475197#M122175</link>
      <description>&lt;P&gt;I am trying to import thousands of&amp;nbsp;XML records(each record with distinct XML mapping)&amp;nbsp; into SAS. I wrote&amp;nbsp;SAS program to loop through&amp;nbsp;&amp;nbsp;each record, copying, parsing, combining and merging the XML results back with the original record. This is all done at the individual record level. Needless to say this is all taking very long.&amp;nbsp; I have utilized all the common I/O efficiency techniques but it still takes about half&amp;nbsp;second to 1 minute for each record to be processed.&amp;nbsp;It takes about 16 hours to&amp;nbsp;process 15000 records. I was thinking to implement this using Parallel processing.&amp;nbsp; Can you point me to some guidance on how I can implement these steps in&amp;nbsp;parallel or if there is any other technique I can use to shorten the run time.&lt;/P&gt;&lt;P&gt;Many Thanks!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Options OBS=500;*/&lt;BR /&gt;dm 'out;clear;log;clear;' ;&lt;BR /&gt;options&amp;nbsp; mprint /*SPOOL OBS=10 bufno=1000*/;&lt;/P&gt;&lt;P&gt;Libname dsnin "P:\Users\XML\XMLEngine\MaxData\Input";&lt;BR /&gt;Libname dsn&amp;nbsp;&amp;nbsp; "P:\Users\XML\XMLEngine\MaxData\Output";&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%Let Infile = g5_items_sample;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Proc PrintTo Log&amp;nbsp; ="C:\XML\XMLROW3\XMLToSAS3.LOG" New;Run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;data xmlrow3;&lt;BR /&gt;&amp;nbsp; set dsnin.xmlrow3(drop=xmlrowx);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Length RowId&amp;nbsp; 4.;&lt;BR /&gt;&amp;nbsp; rowid+1;&lt;BR /&gt;&amp;nbsp; run;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Proc Sql NoPrint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Select max(RowId) InTo: nobsxml&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; From xmlrow3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Quit;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/**&lt;BR /&gt;&amp;nbsp; Loop through the entire file, outputting/importing/processing single record at a time&lt;BR /&gt;**/&lt;/P&gt;&lt;P&gt;%Macro ReadXML;&lt;BR /&gt;&amp;nbsp;%Do i=1 %To &amp;amp;nobsxml.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Data admin;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file "C:\XML\XMLROW3\xmlrowx3.xml";&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set xmlrow3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where rowid=&amp;amp;i.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Put xmlrow;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Run;&lt;/P&gt;&lt;P&gt;/* Create the XMLMap file in temporary area and use this map to read data*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; FileName mapfile&amp;nbsp; "C:\XML\XMLROW3\xmlrowx3.map";run;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; FileName testfile "C:\XML\XMLROW3\xmlrowx3.xml" ;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Libname testfile xmlv2 xmlmap=mapfile auTomap=replace;run;&lt;BR /&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /**&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Create macro variables for each table created by XML record&lt;BR /&gt;&amp;nbsp; **/&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Proc Sql NoPrint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Select&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memname, memname, memname, cats(memname,"x"), count(*)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InTo&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :cp_list separated By ' ',&lt;BR /&gt;&amp;nbsp;:oDataSet1-,&lt;BR /&gt;&amp;nbsp;:ODslist separated By ' ' ,&lt;BR /&gt;&amp;nbsp;:ODslistx separated By ' ',&lt;BR /&gt;&amp;nbsp;:numDataSet&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; From Dictionary.tables&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Where Libname='TESTFILE'&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;BR /&gt;&amp;nbsp; Quit;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp; /** Copy xml tables from testfile to work lib **/&lt;/P&gt;&lt;P&gt;&amp;nbsp; Proc DataSets Lib=work NoList;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Copy In=testfile Out=work;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Select &amp;amp;cp_list;&lt;BR /&gt;&amp;nbsp; Run;&lt;BR /&gt;&amp;nbsp; Quit;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/** Create macro variables for columns in each xml table **/&lt;/P&gt;&lt;P&gt;&amp;nbsp;%Do n=1 %To &amp;amp;numDataSet.;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Proc Sql NoPrint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Select&amp;nbsp; trim(name), count(name)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InTo :var1 - :var&amp;amp;SysMaxLong., :nvar&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; From Dictionary.Columns&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Where&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**reverse(substr(reverse(strip(name)),1, 7)) ne "ORDINAL" And **/&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memname =&amp;nbsp; "&amp;amp;&amp;amp;oDataSet&amp;amp;n.";&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Select count(*) InTo :z From &amp;amp;&amp;amp;oDataSet&amp;amp;n.;&lt;BR /&gt;&amp;nbsp; Quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %let z=&amp;amp;z.;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp; Data &amp;amp;&amp;amp;oDataSet&amp;amp;n. /*(drop=&amp;amp;dropcol.)*/;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Set &amp;amp;&amp;amp;oDataSet&amp;amp;n.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; rowid=&amp;amp;i.;&lt;BR /&gt;&amp;nbsp; Run;&lt;BR /&gt;&amp;nbsp; Proc Sort;By rowid;Run;&lt;/P&gt;&lt;P&gt;/** if there are multiple records in the dataset, collapse these records into a single record **/&lt;BR /&gt;&amp;nbsp;&amp;nbsp; %If &amp;amp;z. gt 1 %Then&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %Do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Data &amp;amp;&amp;amp;oDataSet&amp;amp;n..x;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set &amp;amp;&amp;amp;oDataSet&amp;amp;n.;&lt;BR /&gt;&amp;nbsp;By rowid;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %Do&amp;nbsp; m=1 %To &amp;amp;nvar.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Length &amp;amp;&amp;amp;var&amp;amp;m.._1-&amp;amp;&amp;amp;var&amp;amp;m.._&amp;amp;z. $100.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Array &amp;amp;&amp;amp;var&amp;amp;m..x $100. &amp;amp;&amp;amp;var&amp;amp;m.._1-&amp;amp;&amp;amp;var&amp;amp;m.._&amp;amp;z.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Retain &amp;amp;&amp;amp;var&amp;amp;m.._1-&amp;amp;&amp;amp;var&amp;amp;m.._&amp;amp;Z.&amp;nbsp; ;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %End;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If first.rowid Then&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flg=0;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do i=1 To &amp;amp;z.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %Do c=1 %To &amp;amp;nvar.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp;var&amp;amp;c..x(i)="";&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %End;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; End;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; flg+1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; If flg le &amp;amp;z. Then&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Do;&lt;BR /&gt;&amp;nbsp; %Do c=1 %To &amp;amp;nvar.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp;var&amp;amp;c..x(flg) =&amp;nbsp; &amp;amp;&amp;amp;var&amp;amp;c.. ;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %End;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End;&lt;BR /&gt;&amp;nbsp; %Do c=1 %To &amp;amp;nvar.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; drop &amp;amp;&amp;amp;var&amp;amp;c..&amp;nbsp; ;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %End;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Last.rowid Then Output;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; Run;&lt;BR /&gt;&amp;nbsp;%End;&lt;BR /&gt;&amp;nbsp;%else&lt;BR /&gt;&amp;nbsp;&amp;nbsp; %Do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Data &amp;amp;&amp;amp;oDataSet&amp;amp;n..x;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set &amp;amp;&amp;amp;oDataSet&amp;amp;n.;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Run;&lt;BR /&gt;&amp;nbsp; %End;&lt;BR /&gt;%End;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/** Merge results with the original data record **/&lt;/P&gt;&lt;P&gt;Data adminx;&lt;BR /&gt;&amp;nbsp; merge admin&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;oDslistx.&lt;BR /&gt;&amp;nbsp; ;By rowid;&lt;BR /&gt;Run;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/**Clear out SAS Temp **/&lt;BR /&gt;&amp;nbsp;proc datasets lib=work memtype=data nolist;&lt;BR /&gt;&amp;nbsp; delete &amp;amp;oDslistx. &amp;amp;ODslist.;&lt;BR /&gt;&amp;nbsp;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/***/&lt;BR /&gt;&amp;nbsp;%If &amp;amp;i eq 1 %Then&lt;BR /&gt;&amp;nbsp; %Do;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Data nadmin;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set adminx;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Run;&lt;BR /&gt;&amp;nbsp; %End;&lt;BR /&gt;&amp;nbsp;%Else %If &amp;amp;i gt 1 %Then&lt;BR /&gt;&amp;nbsp; %Do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sql NoPrint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table nadmin as&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select *&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from nadmin&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OUTER UNION CORR&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select *&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from adminx;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; %End;&lt;BR /&gt;&amp;nbsp;/***/&lt;BR /&gt;%End;&lt;BR /&gt;%Mend ReadXML;&lt;BR /&gt;%ReadXML;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/** create permanent dataset **/&lt;BR /&gt;data dsn.xmlrow3;&lt;BR /&gt;&amp;nbsp;set nadmin;&lt;BR /&gt;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 03 Jul 2018 14:50:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/XML-to-SAS-Parallel-importing-parsing-copying/m-p/475197#M122175</guid>
      <dc:creator>SK4</dc:creator>
      <dc:date>2018-07-03T14:50:12Z</dc:date>
    </item>
    <item>
      <title>Re: XML to SAS Parallel importing/parsing/copying</title>
      <link>https://communities.sas.com/t5/SAS-Programming/XML-to-SAS-Parallel-importing-parsing-copying/m-p/475218#M122183</link>
      <description>&lt;P&gt;Have you tried the XML Mapper tool? It's free to download. I've used it half a dozen times or so with success. The XML Mapper&amp;nbsp;creates .map file(s) and you can call those inside of a SAS program editor using code. If the XML files have a consistent naming convention, you can loop through and convert to SAS data sets pretty quickly.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 03 Jul 2018 15:07:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/XML-to-SAS-Parallel-importing-parsing-copying/m-p/475218#M122183</guid>
      <dc:creator>ChanceTGardener</dc:creator>
      <dc:date>2018-07-03T15:07:42Z</dc:date>
    </item>
    <item>
      <title>Re: XML to SAS Parallel importing/parsing/copying</title>
      <link>https://communities.sas.com/t5/SAS-Programming/XML-to-SAS-Parallel-importing-parsing-copying/m-p/475225#M122187</link>
      <description>&lt;P&gt;Hi Thank you for your response.&lt;/P&gt;&lt;P&gt;Yes I actually include the code to generate the map file for each record and use the map file to read in the xml.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;FileName mapfile&amp;nbsp; "C:\XML\XMLROW3\xmlrowx3.map";run;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; FileName testfile "C:\XML\XMLROW3\xmlrowx3.xml" ;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Libname testfile xmlv2 xmlmap=mapfile auTomap=replace;run;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The processing time increases during the Append step as the file grows for each iteration. If I can place that part in the Parallel processing alone might help.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 03 Jul 2018 15:11:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/XML-to-SAS-Parallel-importing-parsing-copying/m-p/475225#M122187</guid>
      <dc:creator>SK4</dc:creator>
      <dc:date>2018-07-03T15:11:56Z</dc:date>
    </item>
  </channel>
</rss>

