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

时间:2016-05-14 01:34:28

标签: talend data-integration

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

我能够通过以下工作实现这一要求:

enter image description here

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

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

为了达到这个目的,我使用了tflowmeter并捕获了计数结果我使用了tFlowmeterCatcher,它给出了对应的输出文件的每行计数的正确结果,但是给出了所有文件中的最后一个文件名我为计数而生成的。

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

2 个答案:

答案 0 :(得分:1)

如果您使用以下说明,您的工作最终会有其他组件,如下所示:

Extended flow for row count and filename

在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");

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

Flow variables filename and rowCount

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

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

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

注意:请注意,如果您向文件添加标头({strong> tFileOutputDelimited 中已检查Include Header),则可能需要更改作业(只需设置int countRows = 1;或您需要的任何内容。我没有测试这个案例。

答案 1 :(得分:0)

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

谢谢!