如何以自由格式RPGLE将字符的多个位置存储在数组内的字符串中?

时间:2017-05-11 05:58:56

标签: arrays split rpgle

在标准RPGLE中,我的代码如下所示。此语句将逗号的位置存储在 ComArr 数组中的数据中。

C     ','           Scan      Data          ComArr  

我尝试过像这样的免费格式。但 ComArr 数组的所有索引都加载了数据中逗号的第一个位置。这是因为%Scan仅返回一个位置,并在将其保存到数组时最终使用单个值加载整个数组。

ComArr = %Scan(',':Data) ;

有没有其他方法可以像C规范那样以自由格式RPGLE处理SCAN?基本上我想拆分由分隔符分隔的字符串。

1 个答案:

答案 0 :(得分:0)

这可能有点晚了,但如果其他人需要按给定的分隔符分割字符串,则此代码应该满足您的需要。

如果使用通配符eval array(*) = ...为数组赋值,则它适用于数组的每个元素。

在您的来源中声明原型:

D split           pr          1024a   varying                     
D  string                    65535a   varying const options(*varsize)
D  delims                       50a   varying const               
D  pos                          10i 0

声明几个变量。 假设您的输入字符串为1000个字符,每个分隔的项目最多为10个字符:

D idx             s             10i 0
D list            s           1000a
D splitAry        s             10a   dim(100)

这是你分割字符串的方法。 这告诉例程您的分隔符是逗号:

c                   eval      idx = 0                          
c                   eval      splitAry(*) = split(list:',':idx)

定义完成工作的程序:

 *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 * split - Split delimited string                                      
 *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Psplit            b                   export                           
D split           pi          1024a   varying                          
D  iString                   65535a   varying const options(*varsize)  
D  iDelims                      50a   varying const                    
D  iPos                         10i 0                                  
 *                                                                     
D result          s           1024a   varying                          
D start           s             10i 0                                  
D char            s              1a                                    
 *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
c                   eval      start = iPos + 1                         
c                   eval      %len(result) = 0                         
 *                                                                     
c                   for       iPos = start to %len(iString)            
c                   eval      char = %subst(iString:iPos:1)            
c                   if        %check(iDelims:char) = 1                 
c                   eval      result = result + char                   
c                   else                                               
c                   leave                                              
c                   endif                                              
c                   endfor                                             
 *                                                                     
c                   return    result                                   
Psplit            e     

如果您在同一个模块中定义并使用它,请不要忘记将dftactgrp(* no)添加到您的H规范中!