Моя цель - преобразовать старый файл .xls в csv . Мне не удалось это сделать со стандартной библиотекой Nifi (просто xlsx), и я не могу найти процессоры с открытым кодом. Поэтому я хотел использовать go для простого (а может, и нет), используя пакет xlrd из python и обернуть мой код в процессор ExecuteScript. Вот как выглядит мой код:
import java.io
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
from org.apache.nifi.processor.io import StreamCallback
import xlrd
class FlowFileParser(StreamCallback):
def __init__(self):
pass
def process(self, inputStream, outputStream):
content = IOUtils.toString(inputStream, StandardCharsets.ISO_8859_1)
myBook = xlrd.open_workbook(file_contents=content,encoding_override = 'latin_1')
mySheet=myBook.sheet_by_index(0)
output=""
for row in range(mySheet.nrows):
for col in range(mySheet.ncols):
if col <= mySheet.ncols -2:
output += str(mySheet.cell(row,col).value) + ','
else:
output += str(mySheet.cell(row,col).value)
output += '\n'
outputStream.write(StringUtil.toBytes(output.encode('latin_1')))
flowFile = session.get()
if flowFile != None:
flowFile = session.write(flowFile, FlowFileParser())
filename = flowFile.getAttribute('filename')
session.putAttribute(flowFile, 'filename', filename +'.csv')
session.transfer(flowFile, REL_SUCCESS)
В этом коде много ошибок, он не может передать строку, в которой я вызываю xlrd.open_workbook. Xlrd не может найти ни одной книги, связанной с содержимым, которое я ему дал (т.е. строкой); если я дам ему byteArray, у меня проблема с кодировкой.
В документации по xlrd указано следующее:
Строка, объект mmap.mmap или другой объект, похожий на поведение . Если указан file_contents, имя файла не будет использоваться, кроме (возможно) в сообщениях
Итак, мой вопрос заключается в том, как преобразовать содержимое моего потока inputStream во что-то читаемое для xlrd (объект файла?).
Я открыт для других идей по преобразованию xls в csv.
Спасибо за вашу помощь,
Pdeuxa