Обработка записи с использованием apache NiFi - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть CSV со следующими данными:

id,name,loan,to_pay,paid
1,sachith,"house,cc,vehicle","10000,24500,233300","2000,5000,2030"
2,nalaka,"edu,cc","3400,5000","200,450"

Здесь у одного пользователя может быть несколько займов (максимум 5). Я хочу разделить это на несколько строк.

id,name,loan,to_pay,paid
1,sachith,house,10000,2000
1,sachith,cc,24500,5000
1,sachith,vehicle,233300,2030
2,nalaka,edu,3400,200
....

Есть ли специальный c процессор для этого?

Редактировать: Предупреждение в ExecuteGroovyScript после @ daggett ответ:

GroovyScript is invalid because
ord.codehaus.groovy.control.MultiCompilationErrorsException: startup failed:
General error during conversion : Error grabbing Grapes  --[unresolved dependency: org.apache.commons#commons-csv;1.8not found] java.lang/RuntimeExceptopm

1 Ответ

1 голос
/ 19 февраля 2020

использование ExecuteGroovyScript процессор:

//for complex csv let's use apache library for parsing/printing
@Grab(group='org.apache.commons', module='commons-csv', version='1.8')
import org.apache.commons.csv.*

def ff=session.get()
if(!ff)return

ff.write{streamIn, streamOut->
    streamOut.withWriter("UTF-8"){w->
        def printer = CSVFormat.EXCEL.withHeader("id","name","loan","to_pay","paid").print(w)
        streamIn.withReader("UTF-8"){r->
            def parser = CSVFormat.EXCEL.withHeader().parse(r)
            parser.each{row->
                //split multivalues and print them in a loop
                def loan   = row.loan.split(',')
                def to_pay = row.to_pay.split(',')
                def paid   = row.paid.split(',')
                for(int i=0;i<loan.size();i++){
                    printer.printRecord(row.id, row.name, loan[i], to_pay[i], paid[i])
                }
            }
        }
        printer.flush()
    }
}
REL_SUCCESS<<ff
...