Sample for using compound variables

[Autolink] Menu

Use the string-oriented search features of REXX where possible.

Example: Suppose you've got a file in the following format:

 
Doe John , 01.03.65, Engineer
Miller Franklin, 03.04.67, Butcher
Gernot Martha, 06.05.65, Saleswoman

To read this file into a compound variable and search an entry you can use the following code:

 
/*                                                                    */
/* sample for using compound variables - slow method                  */
/*                                                                    */

/* ------------------------ variable section ------------------------ */

                    /* name of the input file                         */
  inFile = "pdata.txt"

                    /* name for the output file                       */
  outFile = "data.new"

                    /* compound variable for the file contents        */
  persons. = ""
  persons.0 = 0

/* ------------------------- read the file -------------------------- */

                    /* read the file                                  */
  do i = persons.0+1 while lines( inFile ) <> 0
    persons.i = lineIn( inFile )
  end /* do while lines( inFile ) <> 0 */

  persons.0 = i-1

/* ------------------------ search an entry ------------------------- */

                    /* compound variable with the entries to search   */
  entriesToSearch.0 = 2
  entriesToSearch.1 = "Miller Franklin"
  entriesToSearch.2 = "MILLER Franklin"

  do j = 1 to entriesToSearch.0
    curSearchEntry = entriesToSearch.j

    found = 0
    do i = 1 to persons.0 while found=0
      if pos( curSearchEntry, persons.i ) = 1 then
        found = i
    end /* do i = 1 to persons.0 while found=0 */

    if found <> 0 then
      say "Entry <" || curSearchEntry || "> found: " || ,
           persons.found
    else
      say "Entry <" || curSearchEntry || "> NOT found!"

  end /* do j = 1 to entriesToSearch.0 */

/* --------- write the compound variable back into a file ----------- */

  do i = 1 to persons.0
                    /* ignore deleted entries                         */
    if persons.i <> "" then
      call LineOut outFile, persons.i
  end /* do i = 1 to persons.0 */


You can use this method -- but it's not very fast (especially if you've got hundreds or thousands of entries).

A better method to do this is: Use a key field as name for the tail. Example:

 
/*                                                                    */
/* sample for using compound variables - faster method                */
/*                                                                    */

/* ------------------------ variable section ------------------------ */

                    /* name of the input file                         */
  inFile = "pdata.txt"

                    /* name for the output file                       */
  outFile = "data.new"

                    /* compound variables for the file contents       */
  persons. = ""
  persons.0 = 0

                    /* "index" variable                               */
  personsIndex = ""

                    /* separator for the index variable               */
  separator = "00"x

/* ------------------------- read the file -------------------------- */

  do i = 1 while lines( inFile ) <> 0
    parse value lineIn( inFile ) with entryKey "," entryValue

                    /* in this example the key field is the name of   */
                    /* the person                                     */
    entryKey = strip( entryKey )


                    /* check for duplicate keys and create the stem   */
                    /* entry if possible                              */
    if persons.entryKey <> "" then
    do
                    /* duplicate key found                            */
      say "Error: Duplicate key <" || entryKey || "> in the file!"
    end /* if persons.entryKey <> "" then */
    else
    do
                    /* save the key in the "index" variable           */
      personsIndex = personsIndex || entryKey || separator

      persons.entryKey = entryValue
    end /* else */

  end /* do i = 1 while lines( inFile ) <> 0 */

  persons.0 = i-1

/* ------------------------ search an entry ------------------------- */

                    /* compound variable with the entries to search   */
  entriesToSearch.0 = 2
  entriesToSearch.1 = "Miller Franklin"
  entriesToSearch.2 = "MILLER Franklin"

  do i = 1 to entriesToSearch.0
    curSearchEntry = entriesToSearch.i

    if persons.curSearchEntry <> "" then
      say "Entry <" || curSearchEntry || "> found:" || ,
           persons.curSearchEntry
    else
      say "Entry <" || curSearchEntry || "> NOT found!"
  end /* do i = 1 to entriesToSearch.0 */


/* --------- write the compound variable back into a file ----------- */

  do while personsIndex <> ""

                    /* get the next variable name                     */
    parse var personsIndex curPerson (separator) personsIndex

                    /* ignore deleted entries                         */
    if persons.curPerson <> "" then
      call LineOut outFile, curPerson || "," || persons.curPerson

  end /* do while personIndex <> "" */

Note that you can use any character for the tail of a compound variable. But keep in mind, that using this method the name of the tail is case sensitive! (see also Using variables for the tail)


[Back: Writing general routines for compound variables]
[Next: Local variables]