首页 > 解决方案 > Apache Nifi:计算 csv 文件中字符串中的数字

问题描述

我有一个包含两列的 csv。但是列downloadupload有一个字符串,可以有多个用逗号分隔的值。

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,如下所示。

标签: csvapache-nifidata-processing

解决方案


您可以使用转换 JSON的JoltTransformJSON处理器来实现这一点。它提供了一个splitsum转换,你需要得到你想要的输出。

策略是:

  • 检查 CSV 文件的每一行
  • 从 CSV 转换为 JSON
  • 应用 Jolt 转换,将字符串拆分、转换为整数并最终求和
  • 将记录转换回 CSV
  • 将记录合并到 CSV 文件中

总流量:

在此处输入图像描述

生成流文件:

在此处输入图像描述

SplitRecord 将获取每个 CSV 行并将其转换为 JSON:

在此处输入图像描述

创建一个CSVReaderJsonRecordSetWriter。设置 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"
    }
  }
]
  1. 分裂
  2. 转换为整数
  3. 用转换的覆盖原始下载/上传

将记录转换回 CSV:

在此处输入图像描述

保留 reader 和 writer 的默认属性。最后将每条记录合并回一个 CSV 文件:

在此处输入图像描述

使用具有默认属性的 CSV 读取器和写入器。您可以通过调整 .csv 的属性来控制每个 CSV 文件的记录数MergeRecord在此处阅读有关属性含义的更多信息。

输出:

在此处输入图像描述

请注意,原始行的顺序发生了变化。第一行对应于输入中的最后一行。


推荐阅读