csv - Apache Nifi:计算 csv 文件中字符串中的数字
问题描述
我有一个包含两列的 csv。但是列download
和upload
有一个字符串,可以有多个用逗号分隔的值。
download,upload
"12,3,43","2,33,7,10"
"2,1","4,5,6,23,1"
我需要在字符串中添加每个值并通过添加形成一个新的 csv。所以在 Nifi Workflow 之后,我的输出 csv 必须是:
download,upload
57,52
3,39
基本上应该是在每个字符串内添加值,如下所示。希望您能向我建议要使用的处理器和要更改的配置,以便从输入 csv 实现此输出 csv,如下所示。
解决方案
您可以使用转换 JSON的JoltTransformJSON处理器来实现这一点。它提供了一个split
和sum
转换,你需要得到你想要的输出。
策略是:
- 检查 CSV 文件的每一行
- 从 CSV 转换为 JSON
- 应用 Jolt 转换,将字符串拆分、转换为整数并最终求和
- 将记录转换回 CSV
- 将记录合并到 CSV 文件中
总流量:
生成流文件:
SplitRecord 将获取每个 CSV 行并将其转换为 JSON:
创建一个CSVReader
和JsonRecordSetWriter
。设置 CSVReader 以使用第一行作为标题行。保留默认属性。将每个拆分的记录设置为 1。
使用JoltTransformJson
处理器并提供以下颠簸规范:
[
{
"operation": "modify-default-beta",
"spec": {
"downloadSplit": "=split(',', @(2,download))",
"uploadSplit": "=split(',', @(2,upload))"
}
}, {
"operation": "modify-overwrite-beta",
"spec": {
"downloadSplit": ["=toInteger", 0],
"uploadSplit": ["=toInteger", 0]
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"download": "=intSum(@(1,downloadSplit))",
"upload": "=intSum(@(1,uploadSplit))"
}
}, {
"operation": "shift",
"spec": {
"download": "download",
"upload": "upload"
}
}
]
- 分裂
- 转换为整数
- 和
- 用转换的覆盖原始下载/上传
将记录转换回 CSV:
保留 reader 和 writer 的默认属性。最后将每条记录合并回一个 CSV 文件:
使用具有默认属性的 CSV 读取器和写入器。您可以通过调整 .csv 的属性来控制每个 CSV 文件的记录数MergeRecord
。在此处阅读有关属性含义的更多信息。
输出:
请注意,原始行的顺序发生了变化。第一行对应于输入中的最后一行。
推荐阅读
- javascript - 生成的定义中的打字稿语法错误
- python-3.x - 为什么没有时谷歌浏览器会在我的烧瓶 url 上附加一个正斜杠?
- javascript - 分布式 Wso2sp 未使用 JavaScript 部署 Siddhi 应用程序
- r - 如何在用户指定的命名空间下安装/加载 R 库?
- python - 从表中抓取数据
- asp.net - InvalidOperationException:无法在“ApplicationUser”上配置密钥,因为它是派生类型
- templates - Message模板中如何显示相关节点的图片?
- swift - Clipped Image 在框架外调用 TapAction
- python - 从 pandas 列中提取任何格式的日期(日期是较长字符串的一部分)
- react-native - React Redux 在第一次渲染页面时不更新道具