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 ответа
Я не уверен, что вы просто неправильно настроили работу здесь, но, похоже, она мне подходит.
Вот несколько скриншотов, показывающих мой дизайн работы:
Единственное, о чем я могу подумать, просто взглянув на ваш пост, это то, что вы могли слегка испортить комбинации пар ключ-значение в 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")
всегда будет давать последнее имя файла из повторного списка, который является последним файлом в нашем случае.
Основной поток:
Компонентный вид: