Talend Как передать последний измененный файл в TFileInputDelimited?

Я обыскал все и прочитал этот пост.

Но это не кажется полным и не работает.

Ситуация: мне нужно получить последний измененный файл из каталога на локальной машине. Затем мне нужно передать этот файл в компонент fileinputdelimited.

В настоящее время у меня есть:

tfilelist -> iterate -> titeratetoflow -> tsamplerow ->tflowtoiterate -> tinpufiledelimited ---> tlogrow (просто чтобы убедиться, что он тянет нужный файл)

Но это не работает. Я настроил это. так что titeratetoflow имеет столбец с именем

  • "FileName" с "((String)globalMap.get("CURRENT_FILE"))" в качестве значения,
  • "FileDirectory" с ((String)globalMap.get("CURRENT_FILEDIRECTORY")) в качестве значения и
  • "FileAndDirectory" с ((String)globalMap.get("CURRENT_FILEPATH")) в качестве значения.

Tsamplerow ограничен "1".

Tiflowtoiterate установлен так, чтобы

  • "FileNameOnly" является значением "FileName"
  • "FileDirectoryOnly" является "FileDirectory" и
  • "FilePathComplete" - это "FileAndDirectory"

В поле Расположение файла в tinputfiledelimited у меня есть "((String)globalMap.get("FilePathComplete"))"

Когда он запускается, я получаю сообщение об ошибке cannot find file or path, Если я вырежу компонент fileinput и отправлю его прямо в журнал, он покажет одну строку пустой записи.

Есть идеи?

3 ответа

Решение

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

Вот несколько скриншотов, показывающих мой дизайн работы:

Главная Работа дизайн

Конфигурация tFileList

конфигурация tIterateToFlow

Конфигурация tFlowToIterate

Конфигурация tFileInputDelimited

Единственное, о чем я могу подумать, просто взглянув на ваш пост, это то, что вы могли слегка испортить комбинации пар ключ-значение в tFlowToIterate. Я склонен находить, что настройки по умолчанию там работают хорошо почти все время, и это делает его немного более очевидным, что он делает также.

РЕДАКТИРОВАТЬ: На самом деле, похоже, что вы могли использовать неправильные значения в вашем tIterateToFlow. TFileList перебросит значения путей к файлам и т. Д. В глобальную карту, но перед ним будет указано уникальное имя компонента. Если вы нажмете ctrl+space в окне значений должен появиться список доступных значений (они также указаны на вкладке "Контур" студии). Обычно он делает неявное преобразование в строку, но для этого вам нужно явно преобразовать его, поэтому используйте .toString() вместо (String),

Другой способ получить последний измененный файл, как показано ниже

tFileList (отсортированный DESC по дате изменения файла) ------> tFixedFlowInput (схема - имя файла, номер файла) ----->tHashOutput

здесь в tFixedFlowInput filename = file (String) globalMap.get("tFileList_1_CURRENT_FILEPATH") + "/" + (String) globalMap.get ("tFileList_1_CURRENT_FILE")

filenumber = (Integer) globalMap.get ("tFileList_1_NB_FILE")

Выше будет выполнено получение списка всех файлов в каталоге с их номером / рангом, где последний измененный файл будет иметь номер файла =1, а рядом будет 2... и так далее.

Теперь в SubJobOK вышеупомянутого tFileList вы можете иметь tHashInput, который будет читать сверху tHashOutput и фильтровать только строку, где filenumber==1 - что означает последний измененный файл.

tHashInput (ссылка на tHashoutput) ---->tFilterRow(filenumber==1)------>tLogRow

Одна из причин, по которой вы получаете значение NULL, - это, вероятно, использование globalMap.get("CURRENT_FILEPATH) вместо globalMap.get (" tFileList_1_CURRENT_FILEPATH ").

Простое решение для вышеуказанной проблемы может быть следующим:

tFileList(отсортировано ASC по дате изменения файла)-> tIterateToFlow -> tJava(только чтобы закончить подработку).

Затем на

подражание ок -> tfileinput (использовать (String)globalMap.get("tFileList_1_CURRENT_FILE") или же (String)globalMap.get("tFileList_1_CURRENT_FILEPATH") как имя файла / путь к файлу)

Объяснение:

Поскольку tFileList выполняет итерацию всех файлов в порядке ASC, для последней итерации всегда будет храниться последнее имя файла, хранящееся в globalMap. Список повторяется только до tIterateToFlow, следовательно, после этого компонента (String)globalMap.get("tFileList_1_CURRENT_FILE") всегда будет давать последнее имя файла из повторного списка, который является последним файлом в нашем случае.

Основной поток:

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

Компонентный вид:

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

Другие вопросы по тегам