File 如何删除第一个连接行Talend DI

File 如何删除第一个连接行Talend DI,file,join,talend,delimited,File,Join,Talend,Delimited,如何使用第二行删除文件中的第一个匹配行 我使用Talend DI 7.2,需要使用包含要删除行的第二个文件删除一个分隔文件中的一些行。我的第一个文件包含多个与第二个文件匹配的行,但是对于第二个文件中的每一行,我只需要删除第一个文件中匹配的第一行 例如: File A : File B : Code | Amount Code | Amount 1 | 45 1 | 45

如何使用第二行删除文件中的第一个匹配行

我使用Talend DI 7.2,需要使用包含要删除行的第二个文件删除一个分隔文件中的一些行。我的第一个文件包含多个与第二个文件匹配的行,但是对于第二个文件中的每一行,我只需要删除第一个文件中匹配的第一行

例如:

File A :                      File B :

Code | Amount                 Code | Amount
   1 | 45                        1 | 45
   1 | 45                        3 | 70
   2 | 50                        3 | 70
   2 | 60
   3 | 70
   3 | 70
   3 | 70
   3 | 70
最后,我需要获得:

File A :

Code | Amount
   1 | 45
   2 | 50
   2 | 60
   3 | 70
   3 | 70
文件B中的每一行只缺少文件A中的第一个匹配项

我尝试使用tMap和tFilterRow,但它匹配所有行,而不仅仅是第一行


编辑的示例:我可以在文件B中多次使用相同的耦合代码量,并且我需要从文件A中删除相同数量的行

您可以通过使用Tmap中的变量来执行此操作。我创建了3个:

  • v_match-如果代码和金额在查找文件b中,则返回“match”
  • v_count-如果是重复值,则添加到计数。否则重置为0
  • v_last_row-再次比较之前,将v_match的值设置为该值。通过这种方式,我们可以将当前行与最后一行进行比较并获得计数
然后添加表达式筛选器以删除任何第一个匹配项

这将产生预期的结果:


您可以通过使用Tmap中的变量来实现这一点。我创建了3个:

  • v_match-如果代码和金额在查找文件b中,则返回“match”
  • v_count-如果是重复值,则添加到计数。否则重置为0
  • v_last_row-再次比较之前,将v_match的值设置为该值。通过这种方式,我们可以将当前行与最后一行进行比较并获得计数
然后添加表达式筛选器以删除任何第一个匹配项

这将产生预期的结果:


您无法从文件中删除行,因此必须生成一个新文件,其中只包含所需的行。
这里有一个简单的解决方案。

首先,使用a作为主流,B作为查找之间的左连接来连接文件。
在tMap中,使用输出筛选器,您只将A中与B中的任何内容不匹配的行(
row2.code==null
)或具有匹配但不具有第一个匹配的行写入输出文件。
诀窍是使用一个
数字.sequence
,将代码作为序列的id;如果序列返回的值不是1,那么您知道之前已经有了该行。如果这是代码的第一次出现,序列将从1开始并返回1,因此该行被过滤掉。

您无法从文件中删除行,因此必须生成一个新文件,其中只包含所需的行。
这里有一个简单的解决方案。

首先,使用a作为主流,B作为查找之间的左连接来连接文件。
在tMap中,使用输出筛选器,您只将A中与B中的任何内容不匹配的行(
row2.code==null
)或具有匹配但不具有第一个匹配的行写入输出文件。
诀窍是使用一个
数字.sequence
,将代码作为序列的id;如果序列返回的值不是1,那么您知道之前已经有了该行。如果这是代码的第一次出现,序列将从1开始并返回1,因此该行被过滤掉。

谢谢,但如果我想删除文件A中的两行,该怎么办?例如,如果我在文件B中添加另一行“3 | 70”,我在文件A中有两行相同的行要删除,但此解决方案仅在我要删除的每一行都有不同的代码时有效,但如果我要删除文件A中的两行相同,该怎么办?例如,如果我在文件B中添加另一行“3 | 70”,我在文件A中有两行相同的行要删除,但此解决方案仅在我要删除的每一行都有不同的代码时有效,但如果我要删除文件A中的两行相同,该怎么办?例如,如果我在文件B中添加另一行“3 | 70”,我在文件A中有两行相同的行要删除,但此解决方案仅在我要删除的每一行都有不同的代码时有效,因为我会在查找文件中使用tAggregateRow,然后通过java组件标记要删除的行来循环文件A。然后过滤标志。谢谢,但是如果我想删除文件A中的两行呢?例如,如果我在文件B中添加另一行“3 | 70”,我在文件A中有两行相同的行要删除,但此解决方案仅在我要删除的每一行都有不同的代码时有效,因为我会在查找文件中使用tAggregateRow,然后通过java组件标记要删除的行来循环文件A。然后根据标志进行过滤。