<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=DumpRecall</id>
	<title>DumpRecall - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=DumpRecall"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=DumpRecall&amp;action=history"/>
	<updated>2026-04-28T22:13:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=DumpRecall&amp;diff=1712&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=DumpRecall&amp;diff=1712&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:54Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This works for us, based on keeping &amp;quot;reports&amp;quot; in a DIR type file named &amp;quot;RECALLS&amp;quot; in a particular structure.  The program could be modified to do something similar given different file layouts, or even use PROC&amp;#039;s (if you&amp;#039;re into that kind of thing).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
************************************************************************&lt;br /&gt;
* Program: DUMP.RECALL&lt;br /&gt;
* Author : Ian [[McG]]&lt;br /&gt;
* Date   : 08/18/97&lt;br /&gt;
* Edited : $Id: DUMP.RECALL 17141 2013-10-04 14:54:18Z stiffd01 $&lt;br /&gt;
* Comment: Dump fields to an excel file&lt;br /&gt;
************************************************************************&lt;br /&gt;
* 04/01/1998 Ian  Modify to handle &amp;#039;D&amp;#039; type fields&lt;br /&gt;
* 04/96/1998 Ian  CD each dict item at the start of program&lt;br /&gt;
* 04/24/1998 Ian  Modify to handle @ID type fields (0 index)&lt;br /&gt;
* 06/15/1998 Ian  Do not use so many command line params - look in recall&lt;br /&gt;
* 07/02/1998 Ian  If there&amp;#039;s a select, use it&lt;br /&gt;
* 12/29/1998 Ian  Convert &amp;quot; in data to &amp;#039;&lt;br /&gt;
* 03/11/1999 Ian  Modify to dump in sylk or csv formats&lt;br /&gt;
* 06/18/1999 Ian  Do not call external routine for conversion - dump as we go&lt;br /&gt;
* 07/08/1999 Ian  Modified SUM calc to not include header row&lt;br /&gt;
* 08/20/2001 Ian  Do not parse output manually - use TO DELIM &amp;quot;filename&amp;quot;&lt;br /&gt;
*                 Use perl Spreadsheet::[[WriteExcel]] to generate excel file&lt;br /&gt;
* 08/22/2001 Ian  Do totals at bottom of MR2 columns, optionally email file&lt;br /&gt;
* 08/27/2001 Ian  Do not use UDTEXECUTE for select statement&lt;br /&gt;
* 09/17/2001 Ian  Do a TRIM on recall to get rid of NULL atb names&lt;br /&gt;
*                 Check for &amp;quot;silent&amp;quot; atbs with 0L width and \ heading&lt;br /&gt;
* 01/08/2001 Ian  If recall contains &amp;quot;SPREAD&amp;quot; commands, execute them&lt;br /&gt;
* 01/30/2003 Ian  If recall contains &amp;quot;CSV&amp;quot; dump as tab-delimited&lt;br /&gt;
* 11/03/2004 Ian  Add HTML excel dump&lt;br /&gt;
* 01/17/2005 Ian  Minor fix for change in format - comments after line 1&lt;br /&gt;
* 01/19/2005 Ian  If email address = @LOGNAME, use current user&amp;#039;s address&lt;br /&gt;
* 02/02/2005 Ian  Do not stop looping when select hit - need to exec SPREAD&lt;br /&gt;
&lt;br /&gt;
* A recall consists of one line, which is the &amp;quot;source&amp;quot;&lt;br /&gt;
* followed by the lines of code that actually produce the&lt;br /&gt;
* report.  A tilda in line one represents a &amp;quot;hard&amp;quot; return&lt;br /&gt;
* while a value mark indicates a &amp;quot;soft&amp;quot; return&lt;br /&gt;
* e.g&lt;br /&gt;
* 001: *GET.LIST L1~}SORT LS.MASTER KEY UATB.CUST.NAME.50}TOTAL UATB.OEC (IP\&lt;br /&gt;
* 002: EXECUTE \GET.LIST L1\&lt;br /&gt;
* 003: EXECUTE \SORT LS.MASTER KEY UATB.CUST.NAME.50 TOTAL UATB.OEC (IP\&lt;br /&gt;
* 004: END&lt;br /&gt;
*&lt;br /&gt;
T1=TIME()&lt;br /&gt;
YYYY=OCONV(DATE(),&amp;quot;DY&amp;quot;)&lt;br /&gt;
MM=  OCONV(DATE(),&amp;quot;DM&amp;quot;)&lt;br /&gt;
DD=  OCONV(DATE(),&amp;quot;DD&amp;quot;)&lt;br /&gt;
TT=  OCONV(TIME(),&amp;quot;MT&amp;quot;)&lt;br /&gt;
YMDT = YYYY:MM:DD:TT&lt;br /&gt;
CONVERT &amp;quot;:&amp;quot; TO &amp;quot;&amp;quot; IN YMDT&lt;br /&gt;
USER.NAME = @LOGNAME&lt;br /&gt;
&lt;br /&gt;
OPEN &amp;#039;RECALLS&amp;#039; TO RECALLS ELSE STOP 201,&amp;#039;RECALLS&amp;#039;&lt;br /&gt;
PROMPT &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
HTML.FLAG=0&lt;br /&gt;
CSV.FLAG=1&lt;br /&gt;
DELIM.TYPE=&amp;quot;TAB&amp;quot;&lt;br /&gt;
HDR.FLAG=1&lt;br /&gt;
TAB=CHAR(9)&lt;br /&gt;
&lt;br /&gt;
S=@SENTENCE&lt;br /&gt;
RECALL.NAME=FIELD(S, &amp;#039; &amp;#039;, 2)&lt;br /&gt;
IF RECALL.NAME = &amp;#039;&amp;#039; THEN&lt;br /&gt;
    PRINT @(-1):&amp;#039;ENTER RECALL NAME: &amp;#039;:&lt;br /&gt;
    INPUT RECALL.NAME&lt;br /&gt;
    IF RECALL.NAME = &amp;#039;&amp;#039; OR RECALL.NAME = &amp;#039;/&amp;#039; THEN STOP&lt;br /&gt;
END&lt;br /&gt;
READ RECALL FROM RECALLS, RECALL.NAME ELSE STOP &amp;#039;CANNOT READ RECALLS &amp;#039;:RECALL.NAME&lt;br /&gt;
&lt;br /&gt;
* Decide if we&amp;#039;re emailing or dumping to the shared drive&lt;br /&gt;
P=FIELD(S,&amp;#039; &amp;#039;,3)&lt;br /&gt;
EMAIL=&amp;#039;&amp;#039; ; FILE=&amp;#039;&amp;#039;&lt;br /&gt;
IF INDEX(P,&amp;#039;@&amp;#039;,1) # 0 THEN&lt;br /&gt;
    * Mail the file to someone&lt;br /&gt;
    IF P=&amp;quot;@LOGNAME&amp;quot; THEN P=@LOGNAME&lt;br /&gt;
    EMAIL=P&lt;br /&gt;
END ELSE&lt;br /&gt;
    FILE=P&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
FTP.TARGET=&amp;quot;&amp;quot;&lt;br /&gt;
IF FIELD(FILE,&amp;quot;:&amp;quot;,1)=&amp;quot;FTP&amp;quot; THEN&lt;br /&gt;
    FTP.TARGET=FILE&lt;br /&gt;
    FILE=FIELD(FILE,&amp;quot;:&amp;quot;,5)&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
* See if there&amp;#039;s a select or get-list statement&lt;br /&gt;
GOSUB FIND.SELECT.LINE&lt;br /&gt;
&lt;br /&gt;
* Get rid of the select line and other stuff&lt;br /&gt;
RECALL=RECALL&amp;lt;1&amp;gt;&lt;br /&gt;
DEL RECALL&amp;lt;1,1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IF FILE = &amp;quot;&amp;quot; THEN&lt;br /&gt;
    FILE=RECALL.NAME:&amp;quot;_&amp;quot;:YMDT:&amp;quot;.TXT&amp;quot;&lt;br /&gt;
END ELSE&lt;br /&gt;
    FILE=FILE:&amp;quot;.TXT&amp;quot;&lt;br /&gt;
END&lt;br /&gt;
CONVERT &amp;quot;:&amp;quot; TO &amp;quot;&amp;quot; IN FILE&lt;br /&gt;
* FILE=&amp;#039;/samba_share/recall_dump/&amp;#039;:FILE&lt;br /&gt;
FN = FILE&lt;br /&gt;
FILE=&amp;#039;/samba_share/recall_dump/&amp;#039;:ACCOUNT:&amp;#039;/&amp;#039;:FN&lt;br /&gt;
*&lt;br /&gt;
* We assume that there is a directory in the shared drive&lt;br /&gt;
* the same as the unix user name&lt;br /&gt;
PC.FILE=@LOGNAME&lt;br /&gt;
&lt;br /&gt;
IF SELECT.LINE = &amp;#039;&amp;#039; THEN STOP &amp;#039;MUST HAVE A SELECT LIST &amp;#039;&lt;br /&gt;
&lt;br /&gt;
GOSUB PARSE.ATB.NAMES&lt;br /&gt;
&lt;br /&gt;
HEAD=&amp;quot;&amp;quot;&lt;br /&gt;
EXEC=&amp;quot;LIST &amp;quot;:INFILE:&amp;quot; ID.SUP &amp;quot;&lt;br /&gt;
FOR COL=1 TO NUM.FLDS&lt;br /&gt;
    FLD=FLD.LIST&amp;lt;1,COL&amp;gt;&lt;br /&gt;
    CONV=FLD.LIST&amp;lt;2,COL&amp;gt;&lt;br /&gt;
    COL.HDR=COL.HEAD.LINE&amp;lt;1,COL&amp;gt;&lt;br /&gt;
    IF INDEX(CONV,&amp;quot;MR2&amp;quot;,1) THEN&lt;br /&gt;
        * Pass info to the perl script to say this is a numeric field&lt;br /&gt;
        COL.HDR=&amp;quot;#&amp;quot;:COL.HDR&lt;br /&gt;
    END&lt;br /&gt;
    HEAD:=COL.HDR:&amp;quot;~&amp;quot;&lt;br /&gt;
    IF CONV # &amp;#039;*&amp;#039; THEN&lt;br /&gt;
        IF INDEX(CONV,&amp;quot;,&amp;quot;,1) THEN SWAP &amp;quot;,&amp;quot; WITH &amp;quot;&amp;quot; IN CONV&lt;br /&gt;
        EXEC:=\EVAL &amp;#039;OCONV(\:FLD:\,&amp;quot;\:CONV:\&amp;quot;)&amp;#039; \&lt;br /&gt;
    END ELSE&lt;br /&gt;
        * a &amp;quot;*&amp;quot; indicates no CONV&lt;br /&gt;
        EXEC:=FLD:\ \&lt;br /&gt;
    END&lt;br /&gt;
NEXT COL&lt;br /&gt;
&lt;br /&gt;
NOITEMS.FLAG=0&lt;br /&gt;
*BEGIN CASE&lt;br /&gt;
*    CASE CSV.FLAG&lt;br /&gt;
        GOSUB DUMP.BASIC&lt;br /&gt;
*    CASE 1&lt;br /&gt;
*        GOSUB DUMP.PERL&lt;br /&gt;
*END CASE&lt;br /&gt;
&lt;br /&gt;
IF NOITEMS.FLAG THEN&lt;br /&gt;
    ERR.MESSAGE=&amp;quot;No items selected in recall: &amp;quot;:RECALL.NAME&lt;br /&gt;
    IF EMAIL # &amp;#039;&amp;#039; THEN&lt;br /&gt;
        CALL TRIN.MAIL.SUB(EMAIL, USER.NAME, ERR.MESSAGE, RECALL.NAME, &amp;quot;&amp;quot;)&lt;br /&gt;
    END ELSE&lt;br /&gt;
        PRINT ERR.MESSAGE&lt;br /&gt;
    END&lt;br /&gt;
END ELSE&lt;br /&gt;
    * Success!  Move over to NT server, or email&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
        CASE EMAIL # &amp;#039;&amp;#039;&lt;br /&gt;
            * Send the file as an attachment&lt;br /&gt;
            EXECUTE \TRIN.MAIL.FILE \:FILE:\ \:EMAIL:\ [[/A]]\&lt;br /&gt;
        CASE FTP.TARGET # &amp;#039;&amp;#039;&lt;br /&gt;
            EXECUTE \TRIN.FTP.SEND \:FILE:\ \:FTP.TARGET&lt;br /&gt;
        CASE 1&lt;br /&gt;
            * Move it to the shared drive&lt;br /&gt;
            EXECUTE \TRIN.SMB.MOVE \:FILE:\ \:PC.FILE&lt;br /&gt;
    END CASE&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
T=TIME()-T1&lt;br /&gt;
IF T &amp;lt; 60 THEN&lt;br /&gt;
    PRINT T:&amp;#039; seconds&amp;#039;&lt;br /&gt;
END ELSE&lt;br /&gt;
    PRINT INT(T/60):&amp;#039; minute(s), &amp;#039;:MOD(T,60):&amp;#039; second(s)&amp;#039;&lt;br /&gt;
END&lt;br /&gt;
STOP&lt;br /&gt;
&lt;br /&gt;
PARSE.ATB.NAMES:&lt;br /&gt;
    CONVERT &amp;quot; &amp;quot; TO @VM IN RECALL&lt;br /&gt;
    CONVERT &amp;quot;~&amp;quot; TO &amp;quot;&amp;quot; IN RECALL&lt;br /&gt;
    RECALL=TRIM(RECALL)&lt;br /&gt;
    TOT.FLDS=DCOUNT(RECALL&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    NUM.FLDS=0&lt;br /&gt;
    FLD.LIST=&amp;#039;&amp;#039; ; COL.HEAD.LINE=&amp;#039;&amp;#039;&lt;br /&gt;
    INFILE=&amp;#039;&amp;#039;&lt;br /&gt;
    FOR F=1 TO TOT.FLDS&lt;br /&gt;
        FLD.NAME=RECALL&amp;lt;1,F&amp;gt;&lt;br /&gt;
        IF FLD.NAME=&amp;quot;CSV&amp;quot; THEN CSV.FLAG=1&lt;br /&gt;
        IF FLD.NAME=&amp;quot;TAB&amp;quot; THEN CSV.FLAG=1 ; DELIM.TYPE=&amp;quot;TAB&amp;quot;&lt;br /&gt;
        IF FLD.NAME=&amp;quot;HTML&amp;quot; THEN CSV.FLAG=1 ; DELIM.TYPE=&amp;quot;HTML&amp;quot;&lt;br /&gt;
        IF FLD.NAME=&amp;quot;NOHEAD&amp;quot; THEN HDR.FLAG=0&lt;br /&gt;
        * Check this word to see if it&amp;#039;s a file name, select,&lt;br /&gt;
        * get-list or dictionary atb&lt;br /&gt;
        IF INFILE=&amp;#039;&amp;#039; THEN&lt;br /&gt;
            OPEN FLD.NAME TO DUMMY THEN&lt;br /&gt;
                INFILE=FLD.NAME&lt;br /&gt;
                OPEN INFILE TO INFILE.F ELSE STOP 201,INFILE&lt;br /&gt;
                OPEN &amp;#039;DICT&amp;#039;,INFILE TO @DICT ELSE STOP 201,&amp;#039;DICT &amp;#039;:INFILE&lt;br /&gt;
                CLOSE DUMMY&lt;br /&gt;
            END&lt;br /&gt;
        END ELSE&lt;br /&gt;
            * Add a field to field list, if it&amp;#039;s in the dictionary&lt;br /&gt;
            * and it&amp;#039;s not already in the list and it&amp;#039;s type I or D&lt;br /&gt;
            LOCATE FLD.NAME IN FLD.LIST&amp;lt;1&amp;gt; SETTING POS ELSE&lt;br /&gt;
                READ DREC FROM @DICT, FLD.NAME THEN&lt;br /&gt;
                    IF DREC&amp;lt;1&amp;gt;=&amp;#039;I&amp;#039; OR DREC&amp;lt;1&amp;gt;=&amp;#039;D&amp;#039; THEN GOSUB STORE.FIELD&lt;br /&gt;
                END&lt;br /&gt;
            END&lt;br /&gt;
        END&lt;br /&gt;
    NEXT F&lt;br /&gt;
    IF NUM.FLDS = 0 THEN&lt;br /&gt;
        PRINT ; PRINT &amp;#039;NO ATB NAMES FOUND IN RECALL&amp;#039;&lt;br /&gt;
        STOP&lt;br /&gt;
    END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
STORE.FIELD:&lt;br /&gt;
    HED=DREC&amp;lt;4&amp;gt;&lt;br /&gt;
    WID=DREC&amp;lt;5&amp;gt;&lt;br /&gt;
    * If width=0 and header=&amp;quot;\&amp;quot; then the ATB is suppressed&lt;br /&gt;
    IF (WID=&amp;quot;0L&amp;quot; AND HED=&amp;quot;\&amp;quot;) OR (WID=&amp;quot;0R&amp;quot; AND HED=&amp;quot;\&amp;quot;) THEN RETURN&lt;br /&gt;
    &lt;br /&gt;
    NUM.FLDS+=1&lt;br /&gt;
    COL=NUM.FLDS&lt;br /&gt;
    TYP=DREC&amp;lt;1&amp;gt;&lt;br /&gt;
    ATB=DREC&amp;lt;2&amp;gt;&lt;br /&gt;
    CNV=DREC&amp;lt;3&amp;gt;&lt;br /&gt;
    IF CNV[1,1]=&amp;#039;D&amp;#039; THEN CONVERT &amp;#039;R&amp;#039; TO &amp;#039;D&amp;#039; IN WID&lt;br /&gt;
    IF CNV=&amp;#039;&amp;#039; THEN CNV=&amp;#039;*&amp;#039;&lt;br /&gt;
    FLD.LIST&amp;lt;1,COL&amp;gt;=FLD.NAME&lt;br /&gt;
    FLD.LIST&amp;lt;2,COL&amp;gt;=CNV&lt;br /&gt;
    FLD.LIST&amp;lt;3,COL&amp;gt;=TYP&lt;br /&gt;
    FLD.LIST&amp;lt;4,COL&amp;gt;=ATB&lt;br /&gt;
    FLD.LIST&amp;lt;5,COL&amp;gt;=WID&lt;br /&gt;
    IF HED=&amp;#039;&amp;#039; THEN HED=FLD.NAME&lt;br /&gt;
    CONVERT @VM TO &amp;quot;_&amp;quot; IN HED&lt;br /&gt;
    CONVERT &amp;quot; &amp;quot; TO &amp;quot;_&amp;quot; IN HED&lt;br /&gt;
    * This is the first line of the output file&lt;br /&gt;
    COL.HEAD.LINE&amp;lt;1,COL&amp;gt;=HED&lt;br /&gt;
    IF DREC&amp;lt;1&amp;gt; # &amp;#039;D&amp;#039; THEN&lt;br /&gt;
        E=\CD \:INFILE:\ \:FLD.NAME&lt;br /&gt;
        EXECUTE E CAPTURING DUMMY&lt;br /&gt;
    END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
FIND.SELECT.LINE:&lt;br /&gt;
    SELECT.LINE=&amp;#039;&amp;#039;&lt;br /&gt;
    PRE=&amp;quot;EXECUTE \&amp;quot; ; LEN.PRE=LEN(PRE)&lt;br /&gt;
    * Skip the first &amp;quot;source&amp;quot; code line&lt;br /&gt;
    LINE.NUM=2 ; MAX.LINE=DCOUNT(RECALL,@AM)&lt;br /&gt;
    LOOP&lt;br /&gt;
        * Strip the line to it&amp;#039;s actual code&lt;br /&gt;
        LINE=RECALL&amp;lt;LINE.NUM&amp;gt;&lt;br /&gt;
        IF LINE[1,1]=&amp;#039;*&amp;#039; THEN LINE.NUM+=1 ; CONTINUE&lt;br /&gt;
        LINE=LINE[LEN.PRE+1, 999]&lt;br /&gt;
        LINE=FIELD(LINE,&amp;#039;\&amp;#039;,1)&lt;br /&gt;
        * Is it a GET.LIST or SELECT?&lt;br /&gt;
        FIRST.WORD=FIELD(TRIM(LINE),&amp;#039; &amp;#039;,1)&lt;br /&gt;
        IF FIRST.WORD=&amp;#039;SPREAD&amp;#039; THEN&lt;br /&gt;
            * Execute the spread command&lt;br /&gt;
            EXECUTE LINE&lt;br /&gt;
        END&lt;br /&gt;
        &lt;br /&gt;
        * Go with the first select line we find&lt;br /&gt;
        IF SELECT.LINE=&amp;#039;&amp;#039; THEN&lt;br /&gt;
            IF FIRST.WORD=&amp;#039;GET.LIST&amp;#039; OR FIRST.WORD=&amp;#039;GET-LIST&amp;#039; OR FIRST.WORD=&amp;#039;SELECT&amp;#039; OR FIRST.WORD=&amp;#039;SSELECT&amp;#039; OR FIRST.WORD = &amp;#039;sselect&amp;#039; THEN&lt;br /&gt;
                SELECT.LINE=LINE&lt;br /&gt;
            END&lt;br /&gt;
        END&lt;br /&gt;
    UNTIL LINE.NUM&amp;gt;MAX.LINE DO&lt;br /&gt;
        LINE.NUM += 1&lt;br /&gt;
    REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
DUMP.PERL:&lt;br /&gt;
    * Use the &amp;quot;TO DELIM&amp;quot; unidata feature to dump the records the easy&lt;br /&gt;
    * (and fast) way&lt;br /&gt;
    EXEC:=\ to DELIM &amp;quot;~&amp;quot; \:FILE&lt;br /&gt;
    &lt;br /&gt;
    EXECUTE SELECT.LINE&lt;br /&gt;
    IF @SYSTEM.RETURN.CODE &amp;lt;= 0 THEN&lt;br /&gt;
        NOITEMS.FLAG=1&lt;br /&gt;
        RETURN&lt;br /&gt;
    END&lt;br /&gt;
    &lt;br /&gt;
    UDTEXECUTE EXEC&lt;br /&gt;
    IF @LOGNAME = &amp;quot;stiffd01&amp;quot; THEN PRINT EXEC    &lt;br /&gt;
    * Change the .TXT to null&lt;br /&gt;
    FILE= FILE[1,LEN(FILE)-4]&lt;br /&gt;
    &lt;br /&gt;
    * Now call the perl script to convert to TXT to XLS&lt;br /&gt;
    EXEC=\!/usr/local/bin/recall.pl &amp;quot;\:HEAD:\&amp;quot; \:FILE&lt;br /&gt;
    EXECUTE EXEC&lt;br /&gt;
    &lt;br /&gt;
    FILE=FILE:&amp;quot;.xls&amp;quot;&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
DUMP.BASIC:&lt;br /&gt;
    * We have a list of field names and a select, parse them the hard way&lt;br /&gt;
    * and write a tab-seperated file.  This is slower but avoids limitations&lt;br /&gt;
    * on the number of columns (of unidata) and the perl module [[WriteExcel]]&lt;br /&gt;
    &lt;br /&gt;
    * Change the .TXT to .XLS&lt;br /&gt;
    FILE= FILE[1,LEN(FILE)-4]:&amp;quot;.xls&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    EXECUTE &amp;quot;!&amp;gt;&amp;quot;:FILE&lt;br /&gt;
    OPENSEQ FILE TO FVAR ELSE STOP &amp;#039;CANNOT OPEN &amp;#039;:FILE&lt;br /&gt;
    &lt;br /&gt;
    IF DELIM.TYPE=&amp;quot;HTML&amp;quot; THEN&lt;br /&gt;
        * Write the HTML header block - csv and tab don&amp;#039;t need a header&lt;br /&gt;
        R=\&amp;lt;html xmlns:o=&amp;quot;urn:schemas-microsoft-com:office:office&amp;quot;\&lt;br /&gt;
        R:=\xmlns:x=&amp;quot;urn:schemas-microsoft-com:office:excel&amp;quot;\&lt;br /&gt;
        R:=\xmlns=&amp;quot;http://www.w3.org/TR/REC-html40&amp;quot;&amp;gt;\&lt;br /&gt;
        GOSUB DO.WRITE&lt;br /&gt;
        &lt;br /&gt;
        R=\&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;\&lt;br /&gt;
        GOSUB DO.WRITE&lt;br /&gt;
        &lt;br /&gt;
        R=\&amp;lt;body&amp;gt;&amp;lt;table border=1&amp;gt;\&lt;br /&gt;
        GOSUB DO.WRITE&lt;br /&gt;
    END&lt;br /&gt;
    &lt;br /&gt;
    * This is the same for CSV, TAB and HTML from here on out&lt;br /&gt;
    &lt;br /&gt;
    IF HDR.FLAG THEN&lt;br /&gt;
        * Write a header line&lt;br /&gt;
        REC.OUT=&amp;#039;&amp;#039;&lt;br /&gt;
        FOR COL=1 TO NUM.FLDS&lt;br /&gt;
            FLD=COL.HEAD.LINE&amp;lt;1,COL&amp;gt;&lt;br /&gt;
            REC.OUT&amp;lt;1,COL&amp;gt;=FLD&lt;br /&gt;
        NEXT COL&lt;br /&gt;
        GOSUB WRITE.LINE&lt;br /&gt;
    END&lt;br /&gt;
    &lt;br /&gt;
    EXECUTE SELECT.LINE&lt;br /&gt;
    IF @SYSTEM.RETURN.CODE = 0 THEN&lt;br /&gt;
        NOITEMS.FLAG=1&lt;br /&gt;
        RETURN&lt;br /&gt;
    END&lt;br /&gt;
    &lt;br /&gt;
    LOOP&lt;br /&gt;
        READNEXT @ID ELSE EXIT&lt;br /&gt;
        REC.OUT=&amp;#039;&amp;#039;&lt;br /&gt;
        READ @RECORD FROM INFILE.F, @ID ELSE STOP &amp;#039;CANNOT READ &amp;#039;:@ID&lt;br /&gt;
        FOR COL=1 TO NUM.FLDS&lt;br /&gt;
            FLD=FLD.LIST&amp;lt;1,COL&amp;gt;&lt;br /&gt;
            CONV=FLD.LIST&amp;lt;2,COL&amp;gt;&lt;br /&gt;
            * Should this have a flag?&lt;br /&gt;
            CONVERT &amp;quot;,&amp;quot; TO &amp;quot;&amp;quot; IN CONV&lt;br /&gt;
            TYP=FLD.LIST&amp;lt;3,COL&amp;gt;&lt;br /&gt;
            ATB=FLD.LIST&amp;lt;4,COL&amp;gt;&lt;br /&gt;
            IF TYP=&amp;quot;D&amp;quot; THEN&lt;br /&gt;
                IF ATB=0 THEN VALUE=@ID ELSE VALUE=@RECORD&amp;lt;ATB&amp;gt;&lt;br /&gt;
            END ELSE&lt;br /&gt;
                VALUE=CALCULATE(FLD)&lt;br /&gt;
            END&lt;br /&gt;
            IF CONV # &amp;#039;*&amp;#039; THEN&lt;br /&gt;
                * &amp;#039;*&amp;#039; Denotes no conversion code in field 3&lt;br /&gt;
                VALUE=OCONV(VALUE,CONV)&lt;br /&gt;
            END&lt;br /&gt;
            REC.OUT&amp;lt;1,COL&amp;gt;=VALUE&lt;br /&gt;
        NEXT COL&lt;br /&gt;
        GOSUB WRITE.LINE&lt;br /&gt;
    REPEAT&lt;br /&gt;
    CLOSESEQ FVAR&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
WRITE.LINE:&lt;br /&gt;
    * Take REC.OUT and parse&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
        CASE DELIM.TYPE=&amp;quot;TAB&amp;quot;&lt;br /&gt;
            CONVERT @VM TO TAB IN REC.OUT&lt;br /&gt;
            R=REC.OUT ; GOSUB DO.WRITE&lt;br /&gt;
        CASE DELIM.TYPE=&amp;quot;CSV&amp;quot;&lt;br /&gt;
            R=&amp;#039;&amp;#039;&lt;br /&gt;
            FOR COL=1 TO NUM.FLDS&lt;br /&gt;
                R=R:\&amp;quot;\:REC.OUT&amp;lt;1,COL&amp;gt;:\&amp;quot;,\&lt;br /&gt;
            NEXT COL&lt;br /&gt;
            * Strip trailing comma&lt;br /&gt;
            R=R[1,LEN(R)-1]&lt;br /&gt;
            GOSUB DO.WRITE&lt;br /&gt;
        CASE DELIM.TYPE=&amp;quot;HTML&amp;quot;&lt;br /&gt;
            * Turn @VM into &amp;lt;td&amp;gt;Field&amp;lt;/td&amp;gt;&lt;br /&gt;
            R=&amp;quot; &amp;lt;tr&amp;gt;&amp;quot; ; GOSUB DO.WRITE&lt;br /&gt;
	    R=&amp;quot;&amp;quot;&lt;br /&gt;
            FOR COL=1 TO NUM.FLDS&lt;br /&gt;
                R=R:\  &amp;lt;td&amp;gt;\:REC.OUT&amp;lt;1,COL&amp;gt;:\&amp;lt;/td&amp;gt;\&lt;br /&gt;
            NEXT COL&lt;br /&gt;
	    GOSUB DO.WRITE&lt;br /&gt;
            R=&amp;quot; &amp;lt;/tr&amp;gt;&amp;quot; ; GOSUB DO.WRITE&lt;br /&gt;
        CASE 1&lt;br /&gt;
            * Should never happen&lt;br /&gt;
            R=REC.OUT ; GOSUB DO.WRITE&lt;br /&gt;
    END CASE&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
DO.WRITE:&lt;br /&gt;
    WRITESEQ R APPEND TO FVAR ELSE STOP &amp;#039;CANNOT WRITE &amp;#039;:FILE&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>