Подсчитайте количество строк для каждого файла вместе с именем файла в Talend.

Я создал задание, которое считывает данные из файла и на основе уникальных данных определенных столбцов разбивает набор данных на множество файлов.

Я могу выполнить требование с помощью следующей работы:

введите здесь описание изображения

Теперь из этого задания, которое разбивает вывод на несколько файлов, я хочу добавить дополнительное задание, которое даст мне два столбца.

В первом столбце мне нужно имя файлов, которые я создал в своей основной работе, а во втором столбце я хочу, чтобы количество строк было в каждом созданном выходном файле.

Для этого я использовал tflowmeter, а чтобы поймать результат подсчета, я использовал tFlowmeterCatcher, который дает мне правильный результат для подсчета каждой строки для соответствующих выходных файлов, но дает последнее имя файла во всех файлах, которые у меня есть. генерируется для подсчета.

Как я могу получить правильные имена файлов и соответствующее количество строк.


person user3454116    schedule 14.05.2016    source источник
comment
Можете ли вы использовать (String)globalMap.get("tFileInputPositional_1_CURRENT_FILE") для получения текущего имени файла во втором потоке? Просто добавьте его как значение в tMap_2.   -  person tobi6    schedule 14.05.2016
comment
@tobi6, когда я использую предложенный вами глобальный параметр, он дает мне нулевое значение. Я использовал параметр ((String)globalMap.get(row7.newColumn1)) , но он дает мне последнее имя файла для всех уникальных записей. Можешь помочь с другой логикой   -  person user3454116    schedule 14.05.2016
comment
Хорошо, я должен был взять (String)globalMap.get("tFileInputPositional_1_CURRENT_FILE") там, но это тоже не сработает, потому что tFlowMeterCatcher выполняется после верхней работы. Чего вы пытаетесь достичь?   -  person tobi6    schedule 14.05.2016
comment
Я хочу сгенерировать файлы, каждый из которых имеет имя файла, который я создал в своей основной работе, и во втором столбце я хочу подсчитать количество строк, которые есть в каждом созданном выходном файле.   -  person user3454116    schedule 15.05.2016
comment
Как теперь создать имя файла в tFileOutputDelimited_1? Возможно, вы могли бы использовать компонент tJavaFlex для подсчета строк и сохранения имени файла и количества строк.   -  person tobi6    schedule 15.05.2016
comment
Я использовал ((String)globalMap.get(row7.newColumn1))+.txt для создания нескольких выходных файлов. можете ли вы предоставить фрагмент кода для вашей логики.   -  person user3454116    schedule 15.05.2016


Ответы (2)


Если вы используете следующие направления, ваша работа в конечном итоге будет иметь дополнительные компоненты, такие как:

Расширенный поток для количества строк и имени файла

Используйте tJavaFlex сразу после tFileOutputDelimited на main. Это должно выглядеть так:

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 и другими компонентами, которые могут вам понадобиться для обработки и хранения данных. Соедините самый первый компонент вашего задания с OnSubjobOk с компонентом tBufferInput. Я использовал tLogRow, чтобы показать результат (с моими случайно созданными поддельными данными):

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

ПРИМЕЧАНИЕ. Имейте в виду, что если вы добавите заголовок к файлу (Include Header отмечено в tFileOutputDelimited), задание может потребоваться изменить (просто установите int countRows = 1; или любое другое необходимость). Я не тестировал этот случай.

person tobi6    schedule 22.05.2016

Вы можете использовать компонент tFileproperties для хранения имени файла, сгенерированного в промежуточном excel после первого подзадания, и использовать это excel во втором подзадании.

Спасибо!

person Neeraj    schedule 19.05.2016
comment
Каким будет поток, если я использую компонент tFileProperties. - person user3454116; 20.05.2016