Ложка для чайника Pentaho - Как создать список из 31 столбца данных с плавающим типом, чтобы проверить, является ли он NULL/NOT NULL

Случай:

Корпорация TestCompany ежемесячно отправляет нам данные о расходах в виде CSV-файла. Данные представляют собой пару значений «дата-расход» для каждого serviceId. Также возможно, что в месячном файле есть исправления для данных, присланных в предыдущие месяцы. Значение в более позднем файле является более достоверным. Мы должны разработать процесс приема с подробной моделью данных и диаграммой потока данных, чтобы узнать, как хранить дату и расходы для каждого serviceId с учетом возможности отслеживания записей. Есть вероятность, что следующий файл может содержать обновления.

2) Вход: файл CSV со следующей структурой:

Sr No.  Header

Column 1    serviceId
Column 2    month
Column 3    d1
Column 4    d2
Column 5    d3
Column 6    d4
Column 7    d5
Column 8    d6
Column 9    d7
Column 10   d8
Column 11   d9
Column 12   d10
Column 13   d11
Column 14   d12
Column 15   d13
Column 16   d14
Column 17   d15
Column 18   d16
Column 19   d17
Column 20   d18
Column 21   d19
Column 22   d20
Column 23   d21
Column 24   d22
Column 25   d23
Column 26   d24
Column 27   d25
Column 28   d26
Column 29   d27
Column 30   d28
Column 31   d29
Column 32   d30
Column 33   d31

Примечание:

  • а. Дата, соответствующая первому ненулевому значению, должна рассматриваться как начальная дата.
  • б. Дата, соответствующая последнему ненулевому значению, должна рассматриваться как дата закрытия.
  • в. NULL в CSV между начальной и конечной датами должен рассматриваться как 0,00 только для целей расчета.
  • Пример ввода:

    serviceId,month,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24,d25,d26,d27,d28,d29,d30,d31 FEUSA0002V,200107,,,,,,,,,,,,,,,,,26.2866666667,,,,,,,25.5166666667,25.3333333333,25.7,25.8333333333,,,25.8333333333,26.1666666667

    Столбец месяца представляет месяц, например, 201707 представляет 2017-07. Значение каждого дня представлено номером столбца (d1 из 201707 — 01.07.2017, d2 из 201707 — 02.07.2017 и т. д.).

4) Постановка задачи:

  • а. Для каждого serviceId найдите даты, для которых отсутствуют данные о значении, и подготовьте список дат, разделенных символом «|», чтобы мы могли вернуться к выборке данных из TestCompany Corporation.

  • б. Сохраните преобразованные данные, как указано в 5.b. Итого – это сумма всех доступных значений.

5) Желаемый выходной CSV:

  • a.

    serviceId,missing_dates FEUSA0002V, 2001-07-18|2001-07-19|2001-07-20|2001-07-21|2001-07-22|2001-07-23

  • b.

    serviceId,StartDate,EndDate,Total FEUSA0002V, 2017-07-01,2017-10-31,369.1458

Образец INPUT FEED (несколько строк с одинаковым идентификатором службы)

ServiceId,month,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24,d25,d26,d27,d28,d29,d30,d31
F0CAN062AH,201706,,31.55,,,31.48,31.39,31.42,31.42,31.46,,,31.29,,31.12,31.13,,,,31.33,,31.31,,31.6,,,31.65,31.46,31.64,31.34,,
F0CAN062AH,201707,,,,31.31,,,,,,31.09,,,31.43,,,,31.23,,,31.39,,,,,31.29,31.1,31.0,30.88,,,30.87
FEUSA04ABQ,200304,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,26.98,
F0CAN05N3F,201612,,,,,,,,,,,,,,,,,,,,24.78,24.77,24.8,24.82,,,,,,,,
F0CAN05N3F,201701,,,24.75,,24.96,24.93,,,,24.9,24.96,,24.91,,,24.94,,,24.93,25.12,,,25.0,25.1,,,,,,,25.23
F0CAN05N3F,201702,25.29,25.22,25.27,,,25.29,25.35,,,25.8,,,25.87,,26.02,,,,,,,26.3,,25.93,,,25.77,,,,

person newbee    schedule 08.06.2018    source источник
comment
На вопрос а: я полагаю, вы хотите отсортировать даты?   -  person AlainD    schedule 11.06.2018


Ответы (2)


На вопрос а:

введите здесь описание изображения

  1. Один из способов сделать это — normalize CSV-файл, чтобы результирующий поток состоял из 4 столбцов: ServiceId, месяц, день и значение. Параметры, как на изображении ниже, было бы довольно неприятно писать, если бы вам не помогала кнопка «Get fields».

  2. Затем вам нужно вычислить дату из месяца и поля d#. Я бы сделал это с шагом Javascript, что позволяет заодно поставить дату в формате ISO. Javascript это

    var date = новая дата (month.substr (0,4), month.substr (5,2)-1, substr (день, 1));

  3. Затем filter ServiceId и даты с ненулевым значением.

  4. Если вам нужна сортировка по дате: Sort их по ServiceId, дата

  5. Groupпоток по ServiceId, и Concatenate strings separated by "|", где subject = дата, и name результат "missing_dates".

введите здесь описание изображения

person AlainD    schedule 11.06.2018

На вопрос б.

введите здесь описание изображения

Сделайте то же самое, за исключением того, что последним шагом является Group by ServiceId, где

  • StartDate - это first-non null value даты
  • EndDate - это последнее ненулевое значение даты
  • Итого – это сумма стоимости.

Не то чтобы в этом случае Filter ненулевые значения не являются обязательными.

person AlainD    schedule 11.06.2018