用于流集的Groovy脚本可解析约1500个字符的字符串

时间:2019-05-01 15:53:38

标签: groovy streamsets

这是针对流集的,我正在尝试编写groovy脚本。 我的字符串长度为1500个字符。没有定界符。模式是前4个字符是某些代码,后4个字符是单词的长度,后跟单词。同样,它是某些代码的4个字符和单词长度的4个字符,后跟单词。 例如 22010005PHONE00010002IN00780004ROSE

解码时就像

2201-代码 0005-字长 电话-文字

0001-代码 0002-字长 IN-Word

0078-代码 0004-单词长度 玫瑰-字 等等。

如果代码以00开头,我需要有关Groovy脚本的帮助以创建字符串。 因此,最后一个字符串将是INROSE。

我正在尝试使用while循环和str:substring。 非常感谢您的帮助。

谢谢

def dtx_buf = record.value['TXN_BUFFER']
def fieldid = []
def fieldlen = []
def dtx_out = []
def i = 13
def j = 0
while (i < dtx_buf.size())
{    
//   values = record.value['TXN_BUFFER']
    fieldid[j] = str.substring(values,j,4)      
    output.write(record)
} 

预期结果“ INROSE”

1 个答案:

答案 0 :(得分:4)

一种方法是编写一个包含解析输入规则的Iterator:

class Tokeniser implements Iterator {
    String buf
    String code
    String len
    String word

    // hasNext is true if there's still chars left in `buf`        
    boolean hasNext() { buf }

    Object next() {
        // Get the code and the remaining string
        (code, buf) = token(buf)

        // Get the length and the remaining string
        (len, buf) = token(buf)

        // Get the word (of the given length), and the remaining string
        (word, buf) =  token(buf, len as Integer)

        // Return a map of the code and the word
        [code: code, word: word]
    }

    // This splits the string into the first `length` chars, and the rest
    private token(String input, int length = 4) {
        [input.take(length), input.drop(length)]
    }

}

然后,我们可以用它来做

def result = new Tokeniser(buf: '22010005PHONE00010002IN00780004ROSE')
    .findAll { it.code.startsWith('00') }
    .word
    .join()

结果为INROSE

以2

我们可以尝试另一种没有内部类的迭代方法,以查看该方法在您的环境中是否更好:

def input = '22010005PHONE00010002IN00780004ROSE'
def pos = 0
def words = []

while (pos < input.length() - 8) {
    def code = input.substring(pos, pos + 4)
    def len = input.substring(pos + 4, pos + 8) as Integer
    def word = input.substring(pos + 8, pos + 8 + len)
    if (code.startsWith('00')) {
        words << word
    }
    pos += 8 + len
}

def result = words.join()