如何跳过有效载荷的第一行-常规
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何跳过有效载荷的第一行-常规相关的知识,希望对你有一定的参考价值。
我有csv格式的最终有效负载,并带有一定数量的员工记录。我有2个主要的价值可以使用:
-序列字段(为每个记录添加)-personal_id(每位员工唯一)
由于每个员工可以有多个记录,因此需要为每个ID具有相应的序号。换句话说,如果ID为“ 123”的员工有5条记录,则序列值应为1,2,3,4,5,而不是1,1,1,1,1。所有记录均按ID分组。另外,下面的有效负载仅显示描述所需的2个字段,通常它具有更多的字段。
这里是输入有效载荷:
Sequence;ID
123456
232323
232323
232323
111111
111111
222222
222222
222222
222222
222222
222222
222222
这里是预期的有效载荷
Sequence;ID
1;123456
1;232323
2;232323
3;232323
1;111111
2;111111
1;222222
2;222222
3;222222
4;222222
5;222222
6;222222
7;222222
这是使用常规脚本后的实际有效载荷:
1;Sequence;ID
1;123456
1;232323
2;232323
3;232323
1;111111
2;111111
1;222222
2;222222
3;222222
4;222222
5;222222
6;222222
7;222222
我正在使用以下groovy脚本,但问题是有效载荷的第一行也用1编号。您能告诉我如何跳过有效载荷的第一行吗?该脚本在每条记录中添加一个数字以对其进行计数。提示是将具有相同id的所有记录从1开始递增计数。该脚本可以完美地做到这一点,但问题是正如我所说的那样,当我想跳过有效负载“ Sequence; ...”的第一行以免计算时。
import com.sap.gateway.ip.core.customdev.util.Message
def Message processData(Message message) {
def payload = message.getBody(java.lang.String)
def prevId = ''
def sequence = 1
def sb = new StringBuilder()
def line = new StringReader()
payload.eachLine { line ->
def values = line.split(';')
if (values[1] != prevId) {
// New personal ID
sequence = 1
prevId = values[1]
} else {
// Another line of the same personal ID
sequence += 1
}
line = readLine()
values[0] = sequence
sb.append(values.join(';')).append(System.lineSeparator())
}
message.setBody(sb.toString())
return message
}
答案
您可以执行以下操作:
def payload = '''Sequence;ID
1;123456
1;232323
1;232323
1;232323
1;111111
1;111111
1;222222
1;222222
1;222222
1;222222
1;222222
1;222222
1;222222'''
def input = payload.lines().toList()
def output = [input.head()]
input.tail().inject([:].withDefault { 1 }) { lookup, line ->
def id = line.split(';')[1]
output << "${lookup[id]++};$id"
lookup
}
println output.join(System.lineSeparator())
以上是关于如何跳过有效载荷的第一行-常规的主要内容,如果未能解决你的问题,请参考以下文章