Прочитайте и преобразуйте файл Crystal Report .rpt в .csv или .xlsx в Python 3 - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь написать небольшой скрипт на Python3, чтобы открывать и читать кучу отчетов Crystal Reports .rpt и преобразовывать их в файлы .csv или .xlsx.

Я проверил официальные документы на панд и python3, но не повезло.

Я запустил команду file с моей машины linux на одном из этих файлов, и он дал мне следующее: Файл составного документа V2 Document, Little Endian, Os: Windows, версия 4.10, кодовая страница: 1256, номер редакции: 97

и это привело меня к библиотеке olefile, и я смог загрузить контент, но контент в байтовом формате.

Буду очень признателен, если кто-нибудь сможет мне помочь с тем, как я могу загрузить эти байтовые данные (может быть, сначала их декодировать) в панды и сохранить их в читаемый файл csv или xlsx.

Спасибо, Привет

Ответы [ 3 ]

0 голосов
/ 09 августа 2019

Я сделал версию вручную, потому что read_fwf и другие средства преобразования не могли прочитать мои .rpt файлы

for file_name in file_names:
    list_all = []
    print('Starting File:', file_name)
    with open(os.path.join(INPUT_PATH, file_name),'r', encoding="utf8") as file:
        i= 0 
        for line in file:
            if i == 1: 
                sizes = re.split(' ',line)
                sizes_ = [len(re.sub('^\-','',x)) for x in sizes]
                break
            i += 1

    with open(os.path.join(INPUT_PATH, file_name), 'r', encoding="utf8") as file:     
        i = 0
        for line in file:
            if i == 0:
                line = re.sub(r'[^\x00-\x7F]+','', line)
            i += 1
            if not line[0:1] in ['Ã','á'] and line[0:3]!='---' and len(line.strip()) > 3 and line[:16] != 'Completion time:':
                grabber = []
                trace = 0
                for dist in sizes_:
                    grabber.append(line[trace:dist+2+trace].strip())
                    trace += dist+2
                list_all.append(grabber)
    headers = ['_'.join(i.split('|')[-1:]) for i in list_all[0]]
    df = pd.DataFrame(list_all[1:], columns=headers)
    new_name = file_name.replace('.rpt','.csv')
    df.to_csv(os.path.join(PROCCESSED_PATH,new_name), index=False)
    print('Outputted File:', new_name)
0 голосов
/ 14 августа 2019
import sys
import csv
import codecs

with open("holder.csv", "w") as my_empty_csv:
  pass  
#holder.csv is the output file

def convert(inputFile,outputFile):

    writer = csv.writer(outputFile)
    fieldIndexes = []
    headers = ""

    for idx, val in enumerate(inputFile):
        if(idx == 0):
            headers = val
        elif(idx == 1):
            fieldIndexes = list(getFieldIndexes(val," "))
            row = list(getFields(headers,fieldIndexes))
            writer.writerow(row)
        else:
            row = list(getFields(val,fieldIndexes))
            writer.writerow(row)

def getFieldIndexes(input, sep):
    lastIndex = 0
    for idx, c in enumerate(input):
        if(c == sep):
            yield (lastIndex,idx)
            lastIndex = idx+1
    yield lastIndex, len(input)

def getFields(input, indexes):
    for index in indexes:
        yield input[index[0]:index[1]].strip()

if __name__ == '__main__':
    if(len(sys.argv) == 3):
        with open(sys.argv[1],encoding='utf-8-sig') as inputFile:
            with open(sys.argv[2],'w',newline='') as outputFile:
                convert(inputFile,outputFile)
    else:
        print("Usage: rpt2csv.py inputFile outputFile")

источник: https://github.com/16bytes/rpt2csv.py

0 голосов
/ 09 сентября 2018

Вам не нужно конвертировать. Вы можете прочитать их прямо как CSV:

import pandas as pd
df = pd.read_csv("yourfile.rpt")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...