计算每个文件的行数以及 Talend 中的文件名

Count the number of rows for each file along with the file name in Talend

我构建了一个从文件中读取数据的作业,并根据特定列的唯一数据,将数据集拆分为多个文件。

我能够通过以下工作达到要求:

现在从这个将输出分成多个文件的作业中,我想要的是添加一个子作业,它会给我两列。

在第一列中,我想要我在主要作业中创建的文件的名称,在第二列中,我想要每个创建的输出文件具有的行数。

为了实现这一点,我使用了 tflowmeter 并使用 tFlowmeterCatcher 捕获计数结果,它为相应的输出文件的每行计数提供了正确的结果,但给出了所有文件的最后一个文件名我为计数生成的文件。

如何获得正确的文件名和相应的行数。

您可以使用 tFileproperties 组件存储在第一个子作业后的中间 excel 中生成的文件名,并在第二个子作业中使用此 excel。

谢谢!

如果您使用以下说明,您的作业最终将具有如下附加组件:

在 main 上的 tFileOutputDelimited 之后直接使用 tJavaFlex。它应该是这样的:

Start Code: int countRows = 0;
Main Code:  countRows = countRows + 1;
End Code:   globalMap.put("rowCount", countRows);

将此组件 OnComponentOk 连接到新子作业的第一个组件。该子作业包含一个 tFixedFlowInput、一个 tJavaRow 和一个 tBufferOutput.

tFixedFlowInput就在这里,这样就可以连接OnComponentOk了,什么都不用改。在 tJavaRow 中,您输入以下内容:

output_row.filename = (String)globalMap.get("row7.newColumn"); 
//or whatever is your row variable where the filename is located

output_row.rowCount = (Integer)globalMap.get("rowCount");

在架构中,添加以下元素:

现在只需在第一个子作业的末尾添加一个 tBufferOutput

现在,使用组件 tBufferInput 以及处理和存储数据可能需要的任何组件创建另一个新子作业。将作业的第一个组件与 OnSubjobOktBufferInput 组件连接起来。我使用 tLogRow 来显示结果(使用我随机创建的假数据):

.---------------+--------.
|      LogFileData       |
|=--------------+-------=|
|filename       |rowCount|
|=--------------+-------=|
|fileblerb1.txt |27      |
|fileblerb29.txt|14      |
|fileblerb44.txt|20      |
'---------------+--------'

注意: 请记住,如果您将 header 添加到文件(Include Header 签入 tFileOutputDelimited),作业可能需要更改(只需设置 int countRows = 1; 或您需要的任何内容)。我没有测试这个案例。