× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



A word of caution, though - you need to use the fixed-format SCAN opcode -
the BIF %SCAN only returns the result to the first element of the array, at
least on V5R1 (I got bit by that one). 


Francis 



-----Original Message-----
From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx]
On Behalf Of Stiju Easo
Sent: Friday, April 7, 2006 2:23 AM
To: RPG programming on the AS400 / iSeries
Subject: Re: RPGLE pgm to parse a string

Thanks *Jonathan Mason*
* *
*         *ur idea was the best,
         i was troubled with reverse way

             thanks for all who contributed to this thread
                 hoping that i get an opportunity to return courtesy


On 4/6/06, Jonathan Mason <jonathan.mason@xxxxxxxxxxxxxxxx> wrote:
>
> Terry
>
> >> You can populate an array with the positions of a search argument 
> >> with a string using the SCAN op code.
>
> Thanks for that, in 20+ years of programming RPG I had never noticed 
> that
> -
> just goes to show you never stop learning.
>
> Stiju,
>
> Using the SCAN op code as Terry suggests, the following sub-procedure 
> seems to do what I think you want:
>
>     H DFTACTGRP(*NO)
>
>     D ParseIt         pr           255a   Varying
>     D  iString                    1024a   Value
>     D  iSep                          1a   Value Options(*NoPass)
>
>     D wResult         s             32a
>
>      * Expect *NULL as only two words in string...
>     C                   Eval      wResult=ParseIt('The_Cat')
>     C     wResult       Dsply
>
>      * Expect "The" as only three words in string...
>     C                   Eval      wResult=ParseIt('The_Cat_Sat')
>     C     wResult       Dsply
>
>      * Expect "Cat" as third last word in string...
>     C                   Eval      wResult=ParseIt('The_Cat_Sat_On')
>     C     wResult       Dsply
>
>      * Expect *NULL as only two words in string...
>     C                   Eval      wResult=ParseIt('_Cat_Sat')
>     C     wResult       Dsply
>
>      * Expect *NULL as third last word is missing...
>     C                   Eval      wResult=ParseIt('The__Cat_Sat')
>     C     wResult       Dsply
>
>      * Expect "The" as third last word in string...
>     C                   Eval      wResult=ParseIt('The-Cat-Sat':'-')
>     C     wResult       Dsply
>
>     C                   Eval      *InLr = *On
>
>     p ParseIt         b
>
>     D ParseIt         pi           255a   Varying
>     D  iString                    1024a   Value
>     D  iSep                          1a   Value Options(*NoPass)
>
>     D Pos             s              5  0 Dim(1024)
>     D Ix              s              5  0
>
>     D wSep            s              1a
>     D Error           c                   Const('*ERROR')
>     D Null            c                   Const('*NULL')
>     D Pos1            s              5  0
>     D Pos2            s              5  0
>     D Pos3            s              5  0
>     D wPos            s              5  0
>
>      * Check the number of parameters passed...
>
>     C                   Select
>     C                   When      %Parms = 1
>     C                   Eval      wSep = '_'
>     C                   When      %Parms = 2
>     C                   Eval      wSep = iSep
>     C                   Other
>     C                   Return    Error
>     C                   EndSl
>
>      * Scan the string for all occurrences of the separator
>      * character.  The first element of the Pos array will hold
>      * the first occurrence, the second the second, etc.  All
>      * elements after the last occurrence of the separator character
>      * will be zero...
>
>     C     wSep          Scan      iString       Pos
>
>
>      * There need to be at least two separator characters from the
>      * end of the string.  If there are three or more then we need
>      * return the value between the 3rd and 2nd separators, but if
>      * there are only two and the second starts in position 2 or
>      * later then the word we want starts in position 1...
>
>     C                   Eval      Pos1 = 0
>     C                   Eval      Pos2 = 0
>     C                   Eval      Pos3 = 0
>
>      * First we need to find the last occurrence of the separator
>      * character...
>
>     C                   Eval      Ix = 1
>     C     *Zero
> Lookup    Pos(Ix)                                91
>
>      * ...and then Determine the last three occurrences of
>      * the separator character in the string, Pos1 being the
>      * last occurrence...
>
>     C                   If        Ix > 1
>     C                   Eval      Pos1 = Pos(Ix-1)
>     C                   EndIf
>
>     C                   If        Ix > 2
>     C                   Eval      Pos2 = Pos(Ix-2)
>     C                   EndIf
>
>     C                   If        Ix > 3
>     C                   Eval      Pos3 = Pos(Ix-3)
>     C                   EndIf
>
>      * Return a value depending on the contents of Pos3 and Pos2...
>
>     C                   Select
>     C                   When      Pos3 = 0 and Pos2 = 0
>     C                   Return    Null
>     C                   When      Pos3 = 0 and Pos2 > 1
>     C                   Return    %Subst(iString:1:Pos2 - 1)
>     C                   When      Pos3 > 1 and Pos2 = Pos3 + 1
>     C                   Return    Null
>     C                   When      Pos3 > 1 and Pos2 > Pos3 + 1
>     C                   Return    %Subst(iString:Pos3+1:Pos2-Pos3-1)
>     C                   Other
>     C                   Return    Null
>     C                   EndSl
>
>     p ParseIt         e
>
> It returns the third last delimited "word" from the string and allows 
> you to specify the delimiter.  If no delimiter is specified then "_" 
> is used.  If there are fewer than three delimited "words" in the 
> string then "*ERROR"
> is
> returned.
>
> All the best
>
> Jonathan
>
>
>
>
> --
> This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing 
> list To post a message email: RPG400-L@xxxxxxxxxxxx To subscribe, 
> unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
> or email: RPG400-L-request@xxxxxxxxxxxx Before posting, please take a 
> moment to review the archives at http://archive.midrange.com/rpg400-l.
>
>
--
This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx To subscribe, unsubscribe, or
change list options,
visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives at
http://archive.midrange.com/rpg400-l.

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.