|
|
楼主

楼主 |
发表于 2010-10-22 13:24:01
|
只看该作者
SAS MACRO IMPORTING SQLITE DATA TABLE WITHOUT ODBC
From Wensui Liu's blog
<font face="monospace"><font size="2"><span style="background-color:#ffffff"><font color="#008000">********************************************************;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* A SAS MACRO IMPORTING SQLITE DATA TABLE WITHOUT ODBC *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* ---------------------------------------------------- *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* REQUIREMENT: *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* HAVE SQLITE3.EXE DIRECTORY IN THE SYSTEM PATH. *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* LIMITATIONS: *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* 1. UNABLE TO HANDLE THE TABLE WITH BLOB DATA TYPE *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* 2. THE DEFAULT LENGTH OF ALL CHAR DATA IS 200 *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* 3. SYSTEM DEPENDENT (CHANGES NEEDED FOR OTHER OS) *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* 4. POTENTIALLY SLOW FOR LARGE TABLES *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">********************************************************;</font></span><br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%let</font></span> chlen = <span style="background-color:#ffffff"><font color="#2e8b57"><b>200</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">options</font></span> mlogic symbolgen mprint;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%macro</font></span> sqlite(path = , dbfile = , <span style="background-color:#ffffff"><font color="#0000ff">table</font></span> = );<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%let</font></span> <span style="background-color:#ffffff"><font color="#0000ff">fileref</font></span> = <span style="background-color:#ffffff"><font color="#0000ff">%trim</font></span>(<font color="#0000ff"><b>&path</b></font>)\<span style="background-color:#ffffff"><font color="#0000ff">%trim</font></span>(<font color="#0000ff"><b>&dbfile</b></font>);<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">filename</font></span> <span style="background-color:#ffffff"><font color="#0000ff">fileref</font></span> <span style="background-color:#ffffff"><font color="#a020f0">"&fileref"</font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">%if</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%sysfunc</font></span>(<span style="background-color:#ffffff"><font color="#0000ff">fexist</font></span>(<span style="background-color:#ffffff"><font color="#0000ff">fileref</font></span>)) <span style="background-color:#ffffff"><font color="#0000ff">%then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">%let</font></span> dumpref = <span style="background-color:#ffffff"><font color="#0000ff">%trim</font></span>(<font color="#0000ff"><b>&path</b></font>)\<span style="background-color:#ffffff"><font color="#0000ff">%trim</font></span>(dump.txt);<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">filename</font></span> dumpref <span style="background-color:#ffffff"><font color="#a020f0">"&dumpref"</font></span>;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">%if</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%sysfunc</font></span>(<span style="background-color:#ffffff"><font color="#0000ff">fexist</font></span>(dumpref)) <span style="background-color:#ffffff"><font color="#0000ff">%then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> rc = <span style="background-color:#ffffff"><font color="#0000ff">fdelete</font></span>(<span style="background-color:#ffffff"><font color="#a020f0">"dumpref"</font></span>);<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">%let</font></span> batref = <span style="background-color:#ffffff"><font color="#0000ff">%trim</font></span>(<font color="#0000ff"><b>&path</b></font>)\<span style="background-color:#ffffff"><font color="#0000ff">%trim</font></span>(dump.bat);<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">filename</font></span> batref <span style="background-color:#ffffff"><font color="#a020f0">"&batref"</font></span>;<br /> <br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">%if</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%sysfunc</font></span>(<span style="background-color:#ffffff"><font color="#0000ff">fexist</font></span>(dumpref)) <span style="background-color:#ffffff"><font color="#0000ff">%then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> rc = <span style="background-color:#ffffff"><font color="#0000ff">fdelete</font></span>(<span style="background-color:#ffffff"><font color="#a020f0">"batref"</font></span>);<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><br /> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">file</font></span> batref;<br /> cmd = <span style="background-color:#ffffff"><font color="#a020f0">"sqlite3 &fileref "</font></span>||<span style="background-color:#ffffff"><font color="#a020f0">'"'</font></span>||<span style="background-color:#ffffff"><font color="#a020f0">".dump &table"</font></span>||<span style="background-color:#ffffff"><font color="#a020f0">'"'</font></span>||<span style="background-color:#ffffff"><font color="#a020f0">" > &dumpref"</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">put</font></span> cmd;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /> <br /> <span style="background-color:#ffffff"><font color="#0000ff">systask</font></span> command <span style="background-color:#ffffff"><font color="#a020f0">"&batref"</font></span> wait; <br /> <br /><span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><span style="background-color:#ffffff"><font color="#0000ff">%else</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%goto</font></span> exit;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">create</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">infile</font></span> dumpref;<br /> <span style="background-color:#ffffff"><font color="#0000ff">input</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">create</font></span> = <span style="background-color:#ffffff"><font color="#0000ff">upcase</font></span>(<font color="#a020f0">_infile_</font>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <font color="#a020f0">_n_</font> > <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <span style="background-color:#ffffff"><font color="#0000ff">substr</font></span>(<span style="background-color:#ffffff"><font color="#0000ff">create</font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>) = <span style="background-color:#ffffff"><font color="#a020f0">');'</font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">stop</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc sql</b></font></span> noprint;<br /><span style="background-color:#ffffff"><font color="#0000ff">select</font></span><br /> <span style="background-color:#ffffff"><font color="#0000ff">tranwrd</font></span>(<span style="background-color:#ffffff"><font color="#0000ff">create</font></span>, <span style="background-color:#ffffff"><font color="#a020f0">"TEXT"</font></span>, <span style="background-color:#ffffff"><font color="#a020f0">"CHAR(&chlen.)"</font></span>)<br /><span style="background-color:#ffffff"><font color="#0000ff">into</font></span><br /> :<span style="background-color:#ffffff"><font color="#0000ff">create</font></span> separated <span style="background-color:#ffffff"><font color="#0000ff">by</font></span> <span style="background-color:#ffffff"><font color="#a020f0">' '</font></span><br /><span style="background-color:#ffffff"><font color="#0000ff">from</font></span><br /> <span style="background-color:#ffffff"><font color="#0000ff">create</font></span>;<br /><br /><font color="#0000ff"><b>&create</b></font>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>quit</b></font></span>; <br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc datasets</b></font></span> library = work nolist;<br /> <span style="background-color:#ffffff"><font color="#0000ff">delete</font></span> <span style="background-color:#ffffff"><font color="#0000ff">create</font></span>(mt = <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span>);<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>quit</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">infile</font></span> dumpref <span style="background-color:#ffffff"><font color="#0000ff">end</font></span> = eof;<br /> <span style="background-color:#ffffff"><font color="#0000ff">input</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <font color="#a020f0">_n_</font> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> execute(<span style="background-color:#ffffff"><font color="#a020f0">"PROC SQL;"</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <span style="background-color:#ffffff"><font color="#0000ff">index</font></span>(<span style="background-color:#ffffff"><font color="#0000ff">upcase</font></span>(<font color="#a020f0">_infile_</font>), <span style="background-color:#ffffff"><font color="#a020f0">'INSERT INTO'</font></span>) > <span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> pos1 = <span style="background-color:#ffffff"><font color="#0000ff">index</font></span>(<font color="#a020f0">_infile_</font>, <span style="background-color:#ffffff"><font color="#a020f0">'('</font></span>);<br /> pos2 = <span style="background-color:#ffffff"><font color="#0000ff">index</font></span>(<font color="#a020f0">_infile_</font>, <span style="background-color:#ffffff"><font color="#a020f0">');'</font></span>); <br /> <span style="background-color:#ffffff"><font color="#0000ff">insert</font></span> = <span style="background-color:#ffffff"><font color="#0000ff">substr</font></span>(<font color="#a020f0">_infile_</font>, pos1, pos2 - pos1 + <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> execute(<span style="background-color:#ffffff"><font color="#a020f0">"INSERT INTO &TABLE VALUES"</font></span>||<span style="background-color:#ffffff"><font color="#0000ff">insert</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> eof <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> execute(<span style="background-color:#ffffff"><font color="#a020f0">"QUIT;"</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> rc = <span style="background-color:#ffffff"><font color="#0000ff">fdelete</font></span>(<span style="background-color:#ffffff"><font color="#a020f0">"batref"</font></span>);<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> rc = <span style="background-color:#ffffff"><font color="#0000ff">fdelete</font></span>(<span style="background-color:#ffffff"><font color="#a020f0">"dumpref"</font></span>);<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc contents</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = <font color="#0000ff"><b>&table</b></font> <span style="background-color:#ffffff"><font color="#0000ff">varnum</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br />%exit:<br /> <br /><span style="background-color:#ffffff"><font color="#0000ff">%mend</font></span> sqlite; <br /><br />%sqlite(path = D:\sas, dbfile = test.db, <span style="background-color:#ffffff"><font color="#0000ff">table</font></span> = tblco);</font></font> |
|