Page 1 of 1

Need help in a range string formation logic

Posted: Tue Jul 06, 2010 7:01 am
by muralisankarr
Hi,

We need to form a range pattern to the stings we have. For example

213,001,052,219,220,221v,051,106,102,210,212,103,101,104,211,105,201,202,203,204,205,206,207,208,209,214,215,216,217,218
Should be converted to range pattern as below
001,051-052,101-106,201-221
The input string is sorted and ranges are formed on continuous set of values.

I don't want to go for transformer substringing, horizontal pivot, sort, vertical pivot and remove duplicate stages to handle this as the quantum of jobs where I have to implement this is quite high. Even container with RCP is not a very good option as the computation will be high in multiple instances. Other way I think is stored procedure stage or parallel routine. I don't have c++ skill set. So it is not possible to write any px routines.

If you have some idea to deal with it please suggest

Many Thanks
MSR

Posted: Tue Jul 06, 2010 7:55 am
by ArndW
I have had a tough day at work doing some complex modifications and needed a break, so I wrote a quite BASIC routine to do this. If you use a BASIC transform stage and call up

MakeRangeString(InString)

Code: Select all

****************************************************************************************************************************************************************
** Make a range list out of a comma separated list of numeric values.                                                                                         **
**                                                                                                                                                            **
** Version Date       Programmer           Comments                                                                                                           **
** ======= ========== ==================== ================================================================================================================== **
** 1.0.0   2010-07-06 A. Wussing           Initial Version                                                                                                    **
**                                                                                                                                                            **
****************************************************************************************************************************************************************
   ** Declare include files and constants                                                                                                                     **
   *************************************************************************************************************************************************************
   EQUATE ProgramName  TO "MakeRange"                   ;** Job name to display in DSLog(Info/Warn/Fatal) calls.                                              **
   EQUATE Delimiter    TO ","                           ;** delimiter used in string.                                                                         **
   $COPYRIGHT "(c) 2010 -FreeWare-, no rights reserved" ;** additional Copyright notice put into object code.                                                 **
   $UNDEFINE DebugSwitch                                ;** Debugging turned on or off depending on whether $DEFINE or $UNDEFINE is set here.                 **
                                                        ;*******************************************************************************************************
   WorkString = CONVERT(Delimiter,@FM,InString) ;** make a copy of the parameter
   ************************************
   ** First step is to sort the data **
   ************************************
   Top = DCOUNT(WorkString,@FM)-1
   $IFDEF DebugSwitch CALL DSLogInfo('Entering Bubble Sort with ':Top:' Entries in dynamic sort array.',ProgramName) $ENDIF
   IF Top > 0
   THEN
      DataHasChanged = 1 ;** set to true so we enter the main loop
      LOOP WHILE DataHasChanged
         DataHasChanged = 0 ;** assume that we didn't switch any rows this loop iteration
         FOR RowNum = 1 TO Top
            IF WorkString<RowNum> > WorkString<RowNum+1>
            THEN
               $IFDEF DebugSwitch CALL DSLogInfo('Switching Entries ':i:' and ':i+1:' (Sort).',ProgramName) $ENDIF
               Temp                  = WorkString<RowNum>   ;************************************
               WorkString<RowNum>    = WorkString<RowNum+1> ;** switch the two elements around **
               WorkString<RowNum+1>  = Temp                 ;**                                **
               DataHasChanged = 1                           ;************************************
            END
         NEXT RowNum
         Top -= 1 ;** highest entry can be skipped next time around
      REPEAT
   END ;** of if-then we need to sort, i.e. if there are 2 or more rows in the data
   *************************************************************
   ** Now that we have an ordered list, create the range list **
   *************************************************************
   Ans = '' ;** empty output string
   CurrentRangeStart = WorkString<1> ;** start at the first element
   CurrentRangeEnd   = WorkString<1> ;** same as the start
   FOR i = 2 TO Top+1
      IF WorkString<i> = CurrentRangeEnd+1
      THEN
         CurrentRangeEnd += 1
      END
      ELSE
         ************************************
         ** Not adjacent, so add to output **
         ************************************
         IF CurrentRangeStart=CurrentRangeEnd THEN Ans<-1> = CurrentRangeStart
                                              ELSE Ans<-1> = CurrentRangeStart:'-':CurrentRangeEnd
         CurrentRangeStart = WorkString<i> ;** start at current element
         CurrentRangeEnd   = WorkString<i> ;** same as the start
      END ;** of if-then-else new element is adjacent to old
   NEXT i
   Ans = CONVERT(@FM,Delimiter,Ans) ;** reconvert back to original format.

Posted: Tue Jul 06, 2010 8:48 am
by chulett
So... this is how you take a break, eh? :wink:

Posted: Wed Jul 07, 2010 12:08 am
by muralisankarr
Many thanks AndW. I have started analyzing the code as I have issues with string like one discreet chain. For example 1,2,3 to 1-3 or 1,2 to 1-2 or 1 to 1. I will post the modified code here. Many thanks for your time and baseline code. I can't imagine being employed in a ds job with out dsxchange :D

Posted: Wed Jul 07, 2010 12:49 am
by ray.wurlod
chulett wrote:So... this is how you take a break, eh? :wink:
You orta see how he navigates his boat!!! :wink:

Posted: Wed Jul 07, 2010 1:04 am
by ArndW
I should add that I did a quickie bubble sort last week and just used that code, but I was interested in how I would solve the range logic and happened to have a designer open.

I'm not sure what you mean by "have issues with string like one discreet chain". The code uses the variables "CurrentRangeStart" and "CurrentRangeEnd"; when they are identical it means the range is just one, if they are not then it is a x-y range.