#apache-nifi #carriage-return
#apache-nifi #возврат каретки
Вопрос:
У меня есть текстовый файл для загрузки, но некоторые текстовые поля в этом файле поставляются с символом CR. Официальный разрыв строки — LF, поэтому я решил, что могу заменить все CR и нормализовать файлы.
Но я пытаюсь делать это уже неделю без каких-либо хороших результатов.
До сих пор я пробовал использовать ReplaceText processor с несколькими конфигурациями. Строка за строкой, весь текст, уже пробовал » r», «\ r», «[ r]», но, похоже, ничего не сработало.
У вас есть какие-либо предложения или опыт, чтобы поделиться?
Ответ №1:
Вы можете добиться того же с ExecuteScript
помощью processor, где вы можете реализовать свою пользовательскую логику очистки с меньшими ограничениями. Обратитесь к приведенному ниже фрагменту python, чтобы начать с,
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
from org.apache.nifi.processor.io import StreamCallback
from org.apache.nifi.processors.script import ExecuteScript
from org.python.core.util.FileUtil import wrap
from io import StringIO
import re
# Define a subclass of StreamCallback for use in session.write()
class PyStreamCallback(StreamCallback):
def __init__(self):
pass
def process(self, inputStream, outputStream):
with wrap(inputStream) as f:
lines = f.readlines()
outer_new_value_list = []
is_header_row = True
for row in lines:
if is_header_row:
is_header_row = False
outer_new_value_list.append(row)
continue
char_list = list(row.strip())
for position, char in enumerate(char_list):
// put your custom cleaning logic here
if char == '\' or char == '^' or char == '"' or char == '~' :
replace_char = '\' char
char_list[position] = replace_char
new_data_line = ''.join([str(elem) for elem in char_list])
outer_new_value_list.append(new_data_line 'rn')
with wrap(outputStream, 'w') as filehandle:
filehandle.writelines("%s" % line for line in outer_new_value_list)
# end class
flowFile = session.get()
if (flowFile != None):
flowFile = session.write(flowFile, PyStreamCallback())
session.transfer(flowFile, ExecuteScript.REL_SUCCESS)
# implicit return at the end
Комментарии:
1. Привет, Викрамсин! Спасибо, что нашли время ответить на мой вопрос. Я не смог его протестировать, поэтому не знаю, сработает ли это в моем случае. Но я смог использовать ReplaceText для решения моей проблемы следующим образом.