Проблема в том, что вы вызываете decode
для объекта flowfileList, а не для отдельных потоковых файлов.
Кроме того, вам необходимо получить доступ к содержимому потокового файла, а затем установить содержимое с новой кодировкой.Прямо сейчас вы рассматриваете объект flowfile как строку, но это не так.Я не на своем компьютере, но позже у меня будет рабочий пример кода.
Обновление
Я предоставлю рабочий код Python, чтобы продемонстрировать это, но почему вы не можете просто использовать процессор ConvertCharacterSet
?Это принимает входной набор символов и выходной набор символов.
Вот рабочий код, который преобразует содержимое входящего потокового файла из UTF-16 в UTF-8.Вы должны попытаться отфильтровать уже существующее содержимое UTF-8, чтобы пропустить этот процессор, или добавить код для его идентификации и не обрабатывать его.Вы также можете быть заинтересованы в следующем NIFI-4550 - добавьте процессор InferCharacterSet для того же поведения.
import java.io
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
from org.apache.nifi.processor.io import StreamCallback
# Define a subclass of StreamCallback for use in session.write()
class PyStreamCallback(StreamCallback):
def __init__(self):
pass
def process(self, inputStream, outputStream):
text = IOUtils.toString(inputStream, StandardCharsets.UTF_16)
outputStream.write(bytearray(text.encode('utf-8')))
# end class
flowFileList = session.get(100)
if not flowFileList.isEmpty():
for flowFile in flowFileList:
flowFile = session.write(flowFile, PyStreamCallback())
flowFile = session.putAttribute(flowFile, 'script_character_set', 'UTF-8')
session.transfer(flowFile, REL_SUCCESS)
# implicit return at the end