【问题标题】:PDI - Read CSV Files, if missing field/data then move to the next filePDI - 读取 CSV 文件,如果缺少字段/数据,则移至下一个文件
【发布时间】:2018-07-18 04:14:46
【问题描述】:

我是 PDI 的新手,并且仍在学习它。我正在尝试创建将从一个文件夹中读取所有 csv 文件的转换,检查文件的数据是否正确,这意味着没有丢失/错误/错误格式的行,然后将其存储在数据库中。

我尝试的是:

  1. 使用Text File Input 使用 Apache Common VFS 访问 FTP 中的 CSV 文件。
  2. 使用Filter Row 验证并设置条件以检查 CSV 中的数据(检查文件名、字段是否存在)
  3. 使用Syncronize After Merge 输出到 PostgreSQL 表中。我之所以使用它,是因为我还将 CSV 数据与另一个表中的数据连接起来。

我第二步的结果不是我想要的。目前它会在读取所有 csv 并将所有数据传递到下一步后进行检查,但我想要的是在读取数据时进行检查,以便它只会将正确的数据传递到下一步。我怎样才能做到这一点?有什么建议吗? (需要头脑风暴)

如果在 PDI 中无法实现,则可以读取所有数据并将其传递到下一步,但在插入数据之前会再次验证。

【问题讨论】:

  • 你能给出精确的条件吗? Filter Row 逐行工作,只在流中留下与条件匹配的行。您需要一个全局条件,根据某些条件接受或拒绝整个文件。无论如何,如果该条件是“缺少/错误/错误格式?”,那么您应该在决定之前阅读整个文件。请澄清。
  • 是的,它会先读取整个文件,然后将文件名与表中的数据进行比较以检查它是否是正确的文件,检查所有字段是否正确且其中的行不为空。如果其中一个条件不符合,则该文件中的数据不会被处理,也不会在该文件中插入事件,只有 1 行为空。

标签: kettle pentaho-data-integration pdi


【解决方案1】:

您只能在文件的所有数据都已完全读取和检查后验证文件。

做到这一点的好方法是协调多个转换(一个读取目录,一个检查文件是否有效,一个加载经过验证的文件的数据)。

现在写一份工作可能会是一项艰巨的任务,直到你写了 1/2 打。因此,您可以在一次转换中拥有它。事实上,它是一种基于对整个输入数据定义的指标做出决策或进行计算的模式。

  1. 获取文件列表。
  2. 读取它们以跟踪文件名(在Additional output field 选项卡中)。
  3. 像你一样逐行检查。
  4. 如果至少有一个错误,请做一个总结以拒绝。
  5. 取回 2 的主流,如果文件名被拒绝,则为每一行查找。 (查找流是分组依据的结果)。
  6. 过滤掉文件名被拒绝的行。
  7. 将它们放在 Postgres 上(在使用其他文件或表丰富数据之后)。

只是一个评论。在您的具体情况下,我会稍微改变一下流程,在第一个filter 中测试接受的文件名,并删除group by 和第二个filter。但我认为拥有标准模式对您来说会更有用。

但是,同样,出于各种原因,好的做法是使用主要工作来完成。

【讨论】:

  • 我不知道我可以把Text File Input放在Get File Names之后。顺便说一句,很好的信息。 Get File Names 的用途是什么?它不会将任何字段传递到下一步。
  • 文本文件输入中的错误处理如何?我不明白如何使用它?是否可以在不设置状态的情况下仅过滤具有错误格式等的文件来满足我的要求?
  • PDI 的作者 Matt Caster 曾经告诉我:“阅读文档”。这很残酷,但它就在那里:wiki.pentaho.com/display/EAI/Text+File+Input。当您尝试将步骤连接到下一个步骤时,Spoon 会询问您是正常步骤还是错误步骤。您也可以通过 e 右键单击​​该步骤来执行此操作。
猜你喜欢
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
相关资源
最近更新 更多