csv - 使用 apache NiFi 进行记录处理
问题描述
我有一个包含以下数据的 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
....
是否有特定的处理器来执行此操作?
编辑:@daggett回答ExecuteGroovyScript
后的警告消息:
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
解决方案
使用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
推荐阅读
- python - 如何使用 cm_api api.query_timeseries 设置数据粒度
- php - 如何将大多数产品添加到 laravel 的收藏夹列表中?
- javascript - 向 span 标签添加了 click 事件,并从命名空间中调用了两次
- r - 如何使用 purrr 在多个条件下替换值?
- php - 如何使用 php 中的变量设置具有不同颜色的滑块标题的两个第一个单词?
- r - R:不能用向量中的零替换 NA
- vb.net - 分组不使用两列,但使用一列
- if-statement - 三元运算符的效率是否低于为变量设置不同值的 if 语句
- ruby-on-rails - 为什么我得到 SON::ParserError 试图使用 json_matchers 验证响应?
- c# - C#将多个控制台行写入文本文件