home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / jsmutils.zip / prm2jsm.cmd < prev    next >
OS/2 REXX Batch file  |  1998-06-10  |  12KB  |  327 lines

  1. /*  PRM2ASC.CMD -- Convert Post Road Mailer address book to CSV file.     */
  2. /*  for import into J Street Mailer                                       */        
  3. /*                     Parameters: address_book_file                      */
  4. /*  Output files have same filename as ADR, with ASC and GRP extensions.  */
  5. /*   (c) Copyright 1995, InnoVal System Solutions, Inc., Tom Springall    */
  6. /*        (c) Copyright 1996, modifications, InnoVal, Kari Jackson        */
  7. /*    InnoVal Systems Solutions, Inc., and the authors cannot be held     */
  8. /*   responsible for damage that might occur while using this program.    */
  9. /*                         Use at your own risk.                          */
  10.  
  11. Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
  12. Call SysLoadFuncs
  13.  
  14.  crlf = '0D'x || '0A'x
  15.  
  16.  SAVE_FILECARDS        = X2C('0700') ; SAVE_GROUPS           = X2C('0800')
  17.  SAVE_GNAME            = X2C('2000') ; SAVE_ADDRESSES        = X2C('2200')
  18.  SAVE_GADDRESS         = X2C('2400') ; SAVE_BOOK_NAME        = X2C('3000')
  19.  SAVE_FIRST            = X2C('3500') ; SAVE_CNAME            = X2C('4000')
  20.  SAVE_COMPANY          = X2C('4500') ; SAVE_EMAIL1           = X2C('5000')
  21.  SAVE_EMAIL2           = X2C('7500') ; SAVE_EMAIL3           = X2C('7600')
  22.  SAVE_EMAIL4           = X2C('7700') ; SAVE_EMAIL5           = X2C('7800')
  23.  SAVE_PHONE1           = X2C('8000') ; SAVE_PHONE2           = X2C('8500')
  24.  SAVE_FAX              = X2C('9000') ; SAVE_ADDRESS          = X2C('9500')
  25.  SAVE_NICKNAME1        = X2C('0001') ; SAVE_NICKNAME2        = X2C('0101')
  26.  SAVE_NICKNAME3        = X2C('0201') ; SAVE_NICKNAME4        = X2C('0301')
  27.  SAVE_NICKNAME5        = X2C('0401')
  28.  
  29. nicklist = '' /* to check for duplicates in JStreet nicknames */
  30. nicknames. = '' /* for building groups */
  31. nicknames.0 = 0
  32.  
  33. Arg filespec
  34.  If filespec = '' | Pos('?', filespec) <> 0 Then Signal Help
  35.  
  36.  If Pos('.', filespec) = 0 Then filespec = filespec || '.ADR'
  37.  If Stream(filespec, 'C', 'QUERY EXISTS') = '' Then Signal Err1
  38.  
  39.  Parse Var filespec file '.' ext
  40.  If ext <> 'ADR' Then Signal Err2
  41.  
  42.  filename = SubStr(file, LastPos('\', file) + 1)
  43.  outfile = filename || '.ASC'
  44.  groupfile = filename || '.GRP'
  45.  
  46.  outexists = Stream(outfile, 'C', 'QUERY EXISTS')
  47.  groupexists = Stream(groupfile, 'C', 'QUERY EXISTS')
  48.  If outexists <> '' | groupexists <> '' Then Do
  49.     Say ''
  50.     Say "Output file exists....Type 1 to replace, 2 to append all"
  51.     Say "entries, 3 to append unique entries only, or 4 to exit."
  52.     Do Forever
  53.        Parse Upper Pull key .
  54.        If key = 4 Then Exit 1
  55.        if key = 1 | key = 2 | key = 3 Then Leave
  56.        Say ''
  57.        Say "Please type 1, 2, 3, or 4."
  58.     End
  59.     if key = 1 Then Do
  60.        if outexists <> '' then call sysfiledelete outfile
  61.        if groupexists <> '' then call sysfiledelete groupfile
  62.        outexists = ''
  63.        groupexists = ''
  64.     end
  65.     if key = 2 then append = 'all'
  66.     if key = 3 then append = 'unique'
  67.  end
  68. /* mods for jstreet */
  69.  If SAVE_BOOK_NAME <> GetCodeLen() then Signal Err3
  70.  valu = CharIn(filespec, , len)
  71.  if outexists = '' then do
  72.     if 0 <> LineOut(outfile, '"Nickname","Full Name","Email Address","Telephone Number","Fax Number","Organization","Title","Postal Address","Notes"') then signal err4
  73.  end
  74.  if groupexists = '' then do
  75.     if 0 <> LineOut(groupfile, '"Group Nickname","Nickame"') then signal err4
  76.  end
  77. /* end of mods for jstreet */
  78.  typ = '' ; cards = 0 ; groups = 0 ; data. = '' ; carddata. = '' ; groupdata. = ''
  79.  
  80.  if append='unique' then do
  81.     do 4
  82.        if groupexists<>'' then call linein groupfile
  83.        if outexists<>'' then call linein outfile
  84.     end
  85.     i=0
  86.     do while lines(outfile)
  87.        lin=linein(outfile)
  88.        parse upper var lin . '09'x . '09'x . '09'x Unique1 '09'x . '09'x Unique2 '09'x . '09'x Unique3 '09'x . '09'x Unique4 '09'x . '09'x Unique5 '09'x .
  89.        do j=1 to 5
  90.           check=value(Unique||j)
  91.           if check<>'' then do
  92.              i=i+1
  93.              carddata.i=check
  94.           end
  95.        end
  96.     end
  97.     carddata.0=i
  98.     i=0
  99.     do while lines(groupfile)
  100.        lin=linein(groupfile)
  101.        i=i+1
  102.        parse upper var lin groupdata.i '09'x .
  103.     end
  104.     groupdata.0=i
  105.  end
  106.  
  107.  Do While Chars(filespec) > 0
  108.  
  109.    /* read in code value and length of field */
  110.    code = GetCodeLen()                  /* len is also returned */
  111.    /* read in value of field */
  112.    valu = CharIn(filespec,,len)
  113.  
  114.    Select                               /* handle various code values */
  115.      When code = SAVE_FILECARDS then nop
  116.      When code = SAVE_GROUPS then nop
  117.  
  118.      When code = SAVE_GNAME then do     /* beginning of a new group */
  119.        Call ProcessPrior typ            /* write prior group or page */
  120.        typ = 'GROUP'
  121.        groups = groups + 1
  122.        data. = ''
  123.        addresses = 0                    /* my count of addresses in group */
  124.        data.GROUP_NAME = valu
  125.        end
  126.  
  127.      When code = SAVE_ADDRESSES then nop
  128.  
  129.      When code = SAVE_GADDRESS then do   /* a group address */
  130.        addresses = addresses + 1
  131.        data.GADDRESS.addresses = valu
  132.        end
  133.  
  134.      When code = SAVE_CNAME then do      /* beginning of a new address page */
  135.        Call ProcessPrior typ             /* write prior page or group */
  136.        typ = 'CARD'
  137.        cards = cards + 1
  138.        data. = ''
  139.        data.LAST_NAME = valu             /* last name */
  140.        end
  141.  
  142.      When code = SAVE_FIRST then data.FIRST_NAME = valu
  143.      When code = SAVE_COMPANY then data.ORGANIZATION = valu
  144.      When code = SAVE_EMAIL1 then data.EMAIL1 = valu
  145.      When code = SAVE_EMAIL2 then data.EMAIL2 = valu
  146.      When code = SAVE_EMAIL3 then data.EMAIL3 = valu
  147.      When code = SAVE_EMAIL4 then data.EMAIL4 = valu
  148.      When code = SAVE_EMAIL5 then data.EMAIL5 = valu
  149.      When code = SAVE_PHONE1 then data.PHONE1 = valu
  150.      When code = SAVE_PHONE2 then data.PHONE2 = valu
  151.      When code = SAVE_FAX then data.FAX = valu
  152.      When code = SAVE_ADDRESS then data.COMMENTS = valu
  153.      When code = SAVE_NICKNAME1 then data.NICKNAME1 = valu
  154.      When code = SAVE_NICKNAME2 then data.NICKNAME2 = valu
  155.      When code = SAVE_NICKNAME3 then data.NICKNAME3 = valu
  156.      When code = SAVE_NICKNAME4 then data.NICKNAME4 = valu
  157.      When code = SAVE_NICKNAME5 then data.NICKNAME5 = valu
  158.  
  159.      Otherwise Nop
  160.  
  161.      End /* of Select */
  162.  
  163.    end /* of Do While */
  164.  
  165.  Call ProcessPrior typ            /* write last page or group */
  166.  
  167.  Call CharOut filespec            /* close files */
  168.  Call LineOut outfile
  169.  Call LineOut groupfile
  170.  
  171.  Say ''
  172.  Say 'The ASCII version of' filespec
  173.  Say 'is now in' outfile
  174.  Say cards 'entries were processed.'
  175.  Say ''
  176.  if groups>0 then do
  177.    Say 'The address groups in' filespec
  178.    Say 'are now in' groupfile
  179.    Say groups 'entries were processed.'
  180.    Say ''
  181.  end
  182.  
  183.  Exit                            /* all done. */
  184.  
  185. /*----------------------------------------------------------------------*/
  186. HELP:
  187.  Say ''
  188.  Say 'ADR2ASC.CMD converts a Post Road Mailer address book to a text file.'
  189.  Say ''
  190.  Say 'Syntax is:  ADR2ASC <path>filename.ADR'
  191.  Say ''
  192.  Say 'The ASCII files will be created in the current directory; one with'
  193.  Say 'an .ASC extension and the other (the address groups) with a .GRP'
  194.  Say 'extension.'
  195.  Say ''
  196.  Exit
  197. /*---------------------------------------------------------------------------*/
  198. GETCODELEN: Procedure Expose filespec len
  199.  
  200.    /* get 1st 2 words of each record: code, length */
  201.    w1w2 = CharIn(filespec,,8)
  202.  
  203.    /* save length of what follows (in bytes) */
  204.    len = C2D(Intel(Substr(w1w2,5,2)))
  205.  
  206.    /* return code for field type */
  207.    Return Left(w1w2,2)
  208.  
  209. /*---------------------------------------------------------------------------*/
  210. INTEL:  Procedure    /* Swaps bytes in an Intel 2 or 4 byte number. */
  211.  Parse arg x
  212.  
  213.  If Length(x) = 2 then
  214.    Return Right(x,1) || Left(x,1)
  215.  
  216.  Else
  217.    Return Intel(Right(x,2)) || Intel(Left(x,2))
  218.  
  219. /*---------------------------------------------------------------------------*/
  220. PROCESSPRIOR:
  221.  /* Writes field for prior record to the output file. */
  222.  Arg typ
  223.  
  224.  Select
  225.    When typ = 'CARD' then do            /* address page */
  226.  
  227.      if append = 'unique' then do m = 1 to 5
  228.         check = translate(value('data.EMAIL' || m))
  229.         if check <> '' then do n = 1 to carddata.0
  230.            if check = carddata.n then return
  231.         end
  232.      end
  233. /* mods for jstreet */
  234.      Do While Pos(crlf, data.COMMENTS) > 0
  235.         nl = Pos(crlf, data.COMMENTS)
  236.         data.COMMENTS = Left(data.COMMENTS, nl - 1) || '<BR>' || Substr(data.COMMENTS, nl + 2)
  237.      End
  238.      Do m = 1 To 5 /* process entries with multiple email addresses */
  239.        email = Value('data.EMAIL' || m)
  240.        nick = Value('data.NICKNAME' || m)
  241.        If email = '' Then Iterate
  242.        If nick = '' Then nick = data.LAST_NAME data.FIRST_NAME
  243.        if nick = '' Then nick = data.ORGANIZATION
  244.        if nick = '' Then nick = email
  245.        If data.FIRST_NAME || data.LAST_NAME = '' Then Do
  246.           data.FIRST_NAME = data.ORGANIZATION
  247.           if data.FIRST_NAME = '' Then data.FIRST_NAME = Word(data.COMMENTS,1)
  248.           if data.FIRST_NAME = '' Then data.FIRST_NAME = nick
  249.        End
  250.        nick = Space(nick, 0)
  251.        testnick = nick /* make nickname unique */
  252.        If Pos(testnick,nicklist) > 0 Then Do m = 1 Until Pos(testnick,nicklist) = 0
  253.           testnick = Space(nick '('||m||')', 0)
  254.        End
  255.        If testnick <> nick Then nick = testnick
  256.        nicklist = nicklist nick
  257.        nicknames.0 = nicknames.0 + 1
  258.        s = nicknames.0
  259.        t = s + 1
  260.        nicknames.s = email
  261.        nicknames.t = nick
  262.        nicknames.0 = t
  263.        if 0 <> LineOut(outfile, '"' || nick || '","' || data.FIRST_NAME data.LAST_NAME || '","' || email || '","' || data.PHONE1 || '","' || data.FAX || '","' || data.ORGANIZATION || '","' || 'Title' || '","' || 'Postal Address' || '","' || data.COMMENTS || '"') then signal err4
  264.      End
  265.    end /* of When */
  266.  
  267.    When typ = 'GROUP' then do        /* group of addresses */
  268.  
  269.      if append = 'unique' then do
  270.         check = translate(data.GROUP_NAME)
  271.         do q = 1 to groupdata.0
  272.            if check = groupdata.q then return
  273.         end
  274.      end
  275.  
  276.      groupnick = Strip(Left(Space(data.GROUP_NAME, 0), 8))
  277.      Do i = 1 to addresses
  278.        If Pos('<', data.GADDRESS.i) > 0 & Pos('>', data.GADDRESS.i) > 0 Then
  279.          Parse Var data.GADDRESS.i . '<' data.GADDRESS.i '>' .
  280.        email = Strip(data.GADDRESS.i)
  281.        Do j = 1 To nicknames.0 By 2 While email <> nicknames.j
  282.        End
  283.        k = j + 1
  284.        nick = nicknames.k
  285.        If nick = '' Then Iterate i
  286.        data.GADDRESS.i = '"' || groupnick || '","' || nick || '"'
  287.        if 0 <> LineOut(groupfile, data.GADDRESS.i) then signal err4
  288.      end
  289.  
  290.    end /* of When */
  291. /* end of mods for jstreet */
  292.    Otherwise Nop
  293.  
  294.  End /* of Select */
  295.  
  296.  Return
  297.  
  298. /*---------------------------------------------------------------------------*/
  299. Err1:
  300.  Say 'File' filespec 'not found.'
  301.  Exit 1
  302. /*---------------------------------------------------------------------------*/
  303. Err2:
  304.  Say 'File' filespec 'does not have an address book (.ADR) extension.'
  305.  Exit 1
  306. /*---------------------------------------------------------------------------*/
  307. Err3:
  308.  Say 'File' filespec 'does not appear to be an address book.'
  309.  Call CharOut filespec
  310.  Exit 1
  311. /*---------------------------------------------------------------------------*/
  312. Err4:
  313.  Say 'Error writing to file'
  314.  Call CharOut filespec
  315.  Call LineOut outfile
  316.  Call LineOut groupfile
  317.  Exit 1
  318. /*---------------------------------------------------------------------------*/
  319. Err5:
  320.  say 'Unable to load the REXXUtil functions.  Either the REXXUTIL.DLL file'
  321.  say 'is not on the LIBPATH or REXX support is not installed on this system.'
  322.  exit 1
  323. /*---------------------------------------------------------------------------*/
  324. Syntax:
  325.  say 'Syntax error'
  326.  exit 1
  327.