Найти первое ненулевое значение, сканирующее строки назад от текущей строки

Программное обеспечение

Я использую Pentaho Data Integration 5.4.

Входные данные и объяснение

Входные данные из файла (упрощенно, столбцов больше):

number       name
1009       ProductA
2150       ProductB
3235       ProductC
           ProductD
           ProductE
1234       ProductF
7765       ProductG
4566       ProductH
           ProductI
9907       ProductJ

Проблема в том, что у меня был формат файла Excel xlsx, в котором есть данные с объединенными ячейками, а для одного значения id есть 1..n строк значений.

После преобразования этого файла в csv значения для следующих строк (кроме первой) отсутствуют, несмотря на то, что один столбец не был объединен (см. пример id=3, id=6).

Я создаю sequence, используя шаг Add sequence, ввод сортируется так, как он был первоначально сохранен в файле.

Шаги к достижению цели

В основном, что мне нужно сделать, это:

  • Найдите первое ненулевое значение, у которого sequence_number меньше current_row.sequence_number
  • Объединить значение из поля name с соответствующей строкой
  • Продолжайте сканировать следующие строки с sequence_number выше, чем в последний раз.

Как указывалось ранее, для такого случая может быть 1..n рядов значений.

Ожидаемый результат

number       name
1009       ProductA
2150       ProductB
3235       ProductC; ProductD; ProductE
1234       ProductF
7765       ProductG
4566       ProductH; ProductI
9907       ProductJ

Мой подход

Я считаю, что могу сделать это в цикле, используя Analytic Query и вычисляя LAG(1), а затем объединяя столбец name для одной строки с нулевыми значениями и отбрасывая другие значения столбца из нулевой строки, а затем делая это в цикле (например, 20 раз, если это максимум), но я считаю это плохой идеей.

Вероятно, есть лучшие способы добиться этого результата, используя, например, шаг Java Script со сканированием строк в обратном направлении от текущего (на основе числа sequence), но я не знаю об этих функциях, если они существуют.

Как я могу добиться этого, используя шаг Modified Java Script Value или любой другой эффективный способ, не используя цикл для всего содержимого файла, пока не останется пустых строк?


person Kamil Gosciminski    schedule 18.01.2016    source источник


Ответы (2)



Введение

Объединенные смежные ячейки в файлах Excel представлены на изображении ниже.

Файл Excel с объединенными ячейками

При открытии в виде простого текстового файла он фактически создает пробелы (данные из объединенной ячейки отсутствуют) для каждой строки, кроме первой, которая содержит объединенную ячейку.

number  name
1000/P  um6p1
        um1p2
        um1p3
1500    um2p1
9823    um3p1
83424   um4p1
        um4p2
        um4p3
        um4p4
21390   um5p1

Хотя ответ @bolav решает проблему, в Kettle есть более простой и, возможно, более эффективный подход к этой проблеме.


Подход

  • На шаге Microsoft Excel Input перейдите на вкладку Fields и отметьте параметр Повторить как Y для столбцов, которые хранят значения в объединенных ячейках.
  • Используйте Sort rows в столбце число, потому что шаг Group by требует сортировки входных данных.
  • Group by в поле номер и агрегировать имя с Concatenate strings separated by в качестве типа и ; в качестве значения

Из Руководства пользователя Pentaho:

Повторить Если установлено значение Y, это значение будет повторяться, если поле в следующей строке пусто.

Преобразование

Группировать по шагам

Результаты выполнения

person Kamil Gosciminski    schedule 31.01.2016