как пропустить 1-ю строку полезной нагрузки - groovy - PullRequest
0 голосов
/ 02 марта 2020

У меня есть окончательная полезная нагрузка в формате csv с некоторым количеством записей о сотрудниках. У меня есть 2 основных значения для работы:

-Последовательное поле (добавляется для каждой записи) -personal_id (уникально для каждого сотрудника)

Из-за того факта, что каждый сотрудник может иметь несколько записей, необходимо иметь соответствующий порядковый номер для каждого идентификатора. Другими словами, если у сотрудника с идентификатором «123» 5 записей, значение последовательности должно быть 1,2,3,4,5 вместо 1,1,1,1,1. Все записи сгруппированы по идентификатору. Также полезная нагрузка ниже показывает только 2 поля, необходимые для описания, обычно она имеет гораздо больше полей и является примером stati c полезной нагрузки. Обычно это будет динамически.

вот входная полезная нагрузка:

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

Вот фактическая полезная нагрузка после использования сценария groovy:

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. Можете ли вы показать мне, как пропустить первую строку полезной нагрузки? Скрипт добавляет число в каждую запись, чтобы его подсчитать. Подсказка состоит в том, чтобы все записи с одинаковым идентификатором отсчитывались от 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

}

1 Ответ

0 голосов
/ 03 марта 2020

Если сообщение является просто строкой, .eachLine может быть задано два аргумента: строка и индекс. Вы можете использовать это для создания любых логик c, которые вы хотите в своем замыкании: полностью пропустить индекс 0, вывести его как есть и т. Д. c.

Basi c пример:

payload.eachLine { line, idx ->
    if (idx == 0) {
        // do something with the first line
    } else {
        // everything you currently have
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...