Executescript Apache Nifi: XLS в CSV (с xlrd) - PullRequest
0 голосов
/ 27 мая 2020

Моя цель - преобразовать старый файл .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

...