Python / NiFi: исполняемый скрипт Python для преобразования текстовых файлов UTF-16 в UTF-8 - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть ExecuteScript процессор, и я пытаюсь преобразовать любые файлы, которые поступают в utf-8, если они изначально имеют utf-16.

Пока:

flowFileList = session.get(100)
if not flowFileList.isEmpty():
  for flowFile in flowFileList: 
     # Process each FlowFile here:
     flowFileList.decode("utf-16").encode("utf-8")

Мне кажется, что это должна быть довольно простая операция, как определено в следующих ответах: здесь , здесь и здесь .

Это выдает ошибку: «у объекта нет атрибута« декодировать »в».

Если это глупый вопрос, не стесняйтесь говорить об этом.Спасибо

Поваренная книга для NiFi ExecuteScript: Поваренная книга

1 Ответ

0 голосов
/ 11 декабря 2018

Проблема в том, что вы вызываете 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
...