Динамическое объединение двух файлов CSV с помощью Dataweave в Mule - PullRequest
1 голос
/ 01 июня 2019

Я получаю файлы CSV разной длины из разных источников. Столбцы в CSV отличаются, за исключением того, что каждый CSV-файл всегда будет иметь столбец Id, который можно использовать для связывания записей в разных CSV-файлах. Одновременно необходимо обработать два таких файла CSV. Процесс состоит в том, чтобы взять столбец Id из первого файла и сопоставить строки во втором CSV-файле и создать третий файл, который содержит содержимое из первого и второго файла. Столбец id может быть повторен в первом файле. Например, приведено ниже. обратите внимание, что в первом файле у меня может быть от 18 до 19 комбинаций различных столбцов данных, поэтому я не могу жестко закодировать преобразование в области данных, и есть вероятность, что новый файл будет добавляться каждый раз. Динамический подход - это то, чего я хотел достичь. Таким образом, однажды написанная логика должна работать, даже если добавлен новый файл. Эти файлы тоже становятся большими.

Примеры файлов приведены ниже.

CSV1.csv
--------
id,col1,col2,col3,col4
1,dat1,data2,data3,data4
2,data5,data6,data6,data6
2,data9,data10,data11,data12
2,data13,data14,data15,data16
3,data17,data18,data19,data20
3,data21,data22,data23,data24

CSV2.csv
--------
id,obectId,resid,remarks
1,obj1,res1,rem1
2,obj2,res2,rem2
3,obj3,res3,rem3

Expected file output -CSV3.csv
---------------------
id,col1,col2,col3,col4,objectid,resid,remarks
1,dat1,data2,data3,data4,obj1,res1,rem1
2,data5,data6,data6,data6,obj2,res2,rem2
2,data9,data10,data11,data12,obj2,res2,rem2
2,data13,data14,data15,data16,obj2,res2,rem2
3,data17,data18,data19,data20,obj3,res3,rem3
3,data21,data22,data23,data24,obj3,res3,rem3

Я думал использовать pluck, чтобы получить значения столбцов для первого файла. Идея заключалась в том, чтобы получить столбцы в преобразовании без его жесткого кодирования. Но я получаю некоторые ошибки. После этого у меня есть задача поиска идентификатора и получения значения из второго файла

{(
   using(keys = payload pluck $$)
   (
     payload map 
     ( (value, index) ->
       { 
         (keys[index]) : value

       }
     )
   )
 )}

Я получаю следующую ошибку при использовании pluck

Type mismatch for 'pluck' operator
     found :array, :function

    required :object, :function

Я думаю об использовании groupBy для идентификатора во втором файле, чтобы облегчить поиск. Но нужны предложения о том, как добавить содержимое в одном преобразовании для формирования 3-го файла.

Ответы [ 2 ]

2 голосов
/ 01 июня 2019

Поскольку вы хотите объединить оба CSV без переименования имен столбцов, вы можете попробовать что-то вроде ниже

var file2Grouped=file2 groupBy ((item) -> item.id)
---
file1 map ((item) -> item ++ ((file2Grouped[item.id])[0] default {}) - 'id')

выход

id,col1,col2,col3,col4,obectId,resid,remarks
1,dat1,data2,data3,data4,obj1,res1,rem1
2,data5,data6,data6,data6,obj2,res2,rem2
2,data9,data10,data11,data12,obj2,res2,rem2
2,data13,data14,data15,data16,obj2,res2,rem2
3,data17,data18,data19,data20,obj3,res3,rem3
3,data21,data22,data23,data24,obj3,res3,rem3

0 голосов
/ 03 июня 2019

Рабочее выражение приведено ниже. Удаление идентификатора должно произойти до значения по умолчанию


var file2Grouped=file2 groupBy ((item) -> item.id)
---
file1 map ((item) -> item ++ ((file2Grouped[item.id])[0] - 'id' default {}))

...