这是针对流集的,我正在尝试编写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”
答案 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
我们可以尝试另一种没有内部类的迭代方法,以查看该方法在您的环境中是否更好:
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()