Mule 4 - Как мне обработать нестандартный файл CSV (строка за строкой) - PullRequest
0 голосов
/ 01 марта 2020

Обычный CSV-файл будет содержать строки с одинаковыми столбцами и необязательную строку заголовка, однако в этой ситуации мне нужно обработать CSV, который кажется нестандартным, поскольку в нем есть строка «заголовка», содержащая строку 5 столбцов, за которыми следует неопределенное количество строк «body», каждый из которых содержит около 15 столбцов (не связанных со строкой заголовка), и заканчивается строкой «footer», содержащей 4 столбца.

Это выглядит как Весь файл представляет объект, что-то вроде этого:

headerValue1,headerValue2,headerValue3,headerValue4,headerValue5
bodyvalue1,bodyvalue2,bodyvalue3,bodyvalue4,bodyvalue5,bodyvalue6,bodyvalue7,bodyvalue8,bodyvalue9
bodyvalue1,bodyvalue2,bodyvalue3,bodyvalue4,bodyvalue5,bodyvalue6,bodyvalue7,bodyvalue8,bodyvalue9
footervalue1,footervalue2,footervalue3,footervalue4

Мне нужно преобразовать его в формат JSON, поэтому я пытался установить значения CSV в массив объектов, используя for-l oop но не повезло (нет полезного кода для публикации). Оба формата CSV с заголовком и без в муле, кажется, не работают, так как ожидается, что каждый столбец будет содержать один и тот же тип поля, чего у них нет.

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

Поэтому мой вопрос заключается в том, как правильно или эффективно передать эти данные CSV в пригодный для использования массив или объект, или, может быть, даже прямо в JSON формате?

Ответы [ 2 ]

1 голос
/ 01 марта 2020

DataWeave обрабатывает этот случай. Безымянные столбцы получают общее имя столбца c ('columns_N'). Пример см. В документации . Работает прямое преобразование полезной нагрузки (ie «полезная нагрузка»).

Пример DataWeave:

    ... set the csv into the payload and be sure its MIME type is to application/csv...
    <ee:transform doc:name="Transform Message">
        <ee:message >
            <ee:set-payload ><![CDATA[%dw 2.0
                output application/json
                ---
                payload]]>
            </ee:set-payload>
        </ee:message>
    </ee:transform>

Вывод:

[
  {
    "headerValue1": "bodyvalue1",
    "headerValue2": "bodyvalue2",
    "headerValue3": "bodyvalue3",
    "headerValue4": "bodyvalue4",
    "headerValue5": "bodyvalue5",
    "column_5": "bodyvalue6",
    "column_6": "bodyvalue7",
    "column_7": "bodyvalue8",
    "column_8": "bodyvalue9"
  },
  {
    "headerValue1": "bodyvalue1",
    "headerValue2": "bodyvalue2",
    "headerValue3": "bodyvalue3",
    "headerValue4": "bodyvalue4",
    "headerValue5": "bodyvalue5",
    "column_5": "bodyvalue6",
    "column_6": "bodyvalue7",
    "column_7": "bodyvalue8",
    "column_8": "bodyvalue9"
  },
  {
    "headerValue1": "footervalue1",
    "headerValue2": "footervalue2",
    "headerValue3": "footervalue3",
    "headerValue4": "footervalue4"
  }
]
0 голосов
/ 02 марта 2020

Если я правильно понимаю, ваш файл представляет собой плоскую файловую структуру, состоящую из заголовка, данных / тела, нижнего колонтитула, где каждая запись / сегмент является записью с разделителями. Программа чтения плоских файлов Mule не будет работать, поскольку она может поддерживать только записи фиксированной ширины. Что вы можете сделать, это разделить каждую группу записей на строку, а затем прочитать каждую запись как CSV. Я могу сделать это за два шага преобразования: Преобразование 1 - чтобы прочитать файл и проанализировать полезную нагрузку как массив строк, Преобразование 2 - чтобы преобразовать массив строк в правильный формат json. Обратите внимание, что здесь может возникнуть проблема с производительностью (если ваш плоский файл слишком большой), поскольку он будет содержать полезную нагрузку в виде строки в памяти.

Поток:

enter image description here

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

%dw 2.0
output application/java
---
payload splitBy "\r\n"

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

%dw 2.0
output application/json

var sizePayload = sizeOf(payload)
---
{
    header: read(payload[0], "application/csv", {"header" : false})[0],
    body: read(payload[1 to sizePayload-2] joinBy "\n", "application/csv", {"header" : false}),
    footer: read(payload[sizePayload-1], "application/csv", {"header" : false})[0],
}

Ниже приведен пример файла:

headerValue1,headerValue2,headerValue3,headerValue4,headerValue5
bodyvalue1,bodyvalue2,bodyvalue3,bodyvalue4,bodyvalue5,bodyvalue6,bodyvalue7,bodyvalue8,bodyvalue9
bodyvalue12ndRow,bodyvalue2,bodyvalue3,bodyvalue4,bodyvalue5,bodyvalue6,bodyvalue7,bodyvalue8,bodyvalue92ndRow
footervalue1,footervalue2,footervalue3,footervalue4

Это приведет к следующему json:

{
  "header": {
    "column_0": "headerValue1",
    "column_1": "headerValue2",
    "column_2": "headerValue3",
    "column_3": "headerValue4",
    "column_4": "headerValue5"
  },
  "body": [
    {
      "column_0": "bodyvalue1",
      "column_1": "bodyvalue2",
      "column_2": "bodyvalue3",
      "column_3": "bodyvalue4",
      "column_4": "bodyvalue5",
      "column_5": "bodyvalue6",
      "column_6": "bodyvalue7",
      "column_7": "bodyvalue8",
      "column_8": "bodyvalue9"
    },
    {
      "column_0": "bodyvalue12ndRow",
      "column_1": "bodyvalue2",
      "column_2": "bodyvalue3",
      "column_3": "bodyvalue4",
      "column_4": "bodyvalue5",
      "column_5": "bodyvalue6",
      "column_6": "bodyvalue7",
      "column_7": "bodyvalue8",
      "column_8": "bodyvalue92ndRow"
    }
  ],
  "footer": {
    "column_0": "footervalue1",
    "column_1": "footervalue2",
    "column_2": "footervalue3",
    "column_3": "footervalue4"
  }
}
...