Получение ниже CSV-файла в качестве ввода
Id|Name|ParentId
001|National|AREG-001
0013|Texas|AREG-001
0012|Tennessee|AREG-001
0006|Indiana|AREG-001
и я хочу вывести как
('001','National','AREG-001'),
('0013','Texas','AREG-001'),
('0012','Tennessee','AREG-001'),
('0006','Indiana','AREG-001')
Время выполнения: 4.2.1
как трансформировать.
Это быстрый и простой способ ее решения.
output text/plain
---
"('" ++
(
payload map ((value, index) ->
dw::core::Objects::valueSet(value) joinBy "','"
) joinBy "'),\n('"
)
++ "')"
Не забудьте установить параметр чтения CSV separator = "|"
, чтобы ввод правильно интерпретировался.
Начиная с Mule 4.3 и выше, вы можете использовать valuesOf
вместо dw::core::Objects::valueSet
.
приведенное выше преобразование работает. И я хочу добавить строку «INSERT INTO» к каждому, которая выглядит так: INSERT INTO ('ASC-AREG-001','Ascension National',''); INSERT INTO ('','Ascension Texas','ASC-AREG-001'); INSERT INTO ('ASC-MMKT-0012','','ASC-AREG-001'); INSERT INTO ('ASC-MMKT-0006','Ascension Indiana','ASC-AREG-001');
трансформация для выше спрашивайте: output text/plain var data='insert into' --- "('" ++ ( payload map ((value, index) -> dw::core::Objects::valueSet(value) joinBy "','" ) joinBy "');\n ('" ) ++ "')" replace "('" with (data ++ "('")
Другой способ сделать это с помощью функции reduce() и явной конкатенации каждого поля:
%dw 2.0
output text/plain
---
payload reduce ((item, acc = "") -> acC++ "('" ++ item.Id ++ "','" ++ item.Name ++ "','" ++ item.ParentId ++ "')\n")]]></ee:set-payload>
В любом случае это объединение строк, поэтому вы должны помнить, что если количество записей велико, у вас может не хватить памяти.
Получение ниже проблемы при преобразовании You called the function '++' with these arguments: 1: String ("('") 2: Null (null) But it expects one of these combinations: (Array, Array) (Date, Time) 4| payload reduce ((item, acc = "") -> acC++ "('" ++ item.Id ++ "','" ++ item.Name ++ "','" ++ item.ParentId ++ "')\n") Trace: at main::++ (line: 4, column: 109) at main::++ (line: 4, column: 42)
Похоже, полезная нагрузка не анализируется как CSV. Вы выбираете для него правильный тип пантомимы?
добавление потока: <flow name = "prepare-sql" doc:id = "2896a" ><file:listener doc:name = "On New or Updated File" doc:id = "3a19bfa" config-ref = "File_Config" каталог = "/Users/Documents/temp2" autoDelete = "true" outputMimeType = "application/csv; разделитель=|" ></file:listener> <ee:transform doc:name = "Преобразование каждого поля сообщения" doc:id = "0073d2a1" > <ee:message ><ee:set-payload ><![CDATA[%dw 2.0 вывод text/plain ---payload reduce ((item, acc = "") -> acC++ "('" ++ item.Id ++ "','" ++ item.Name ++ "', '" ++ item.ParentId ++ "')\n")]]></ee:set-payload></ee:message></ee:transform></flow>
Трудно прочитать поток в комментарии, но похоже, что директива заголовка отсутствует в MIME-типе. В противном случае DataWeave не сможет сопоставить имена полей с заголовками в CSV, тогда item.Id и т. д. вернут значение null, что, по-видимому, и упоминается в ошибке. Попробуйте изменить его на outputMimeType = "application/csv;separator='|'; header=true"
'valuesOf' представлен в DataWeave 2.3.0. Поддерживается Mule 4.3 и более поздних версий, но сейчас я использую Runtime 4.2.1.