[Python/R] Prepis hodnôt z excelu do štrukturovaného txt

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod creat 15. 6. 2018 12:58

Zdravím,

potrebujem automatizovať prepis hodnôt z excelu do txt dokumentu. Hodnoty v excely (nie všetky) sa pravidelne menia (raz za štvrťrok) a je ich rovnako ako v txt forme niekoľko stoviek riadkov. Tiež vidíte, že štruktúra hodnôt v txt je divoká a musí ostať zachovaná. Robím to ručne, ale už ma to otravuje (zabere to aj pol dňa). Potrebujem niečo, čo mi tento prenos údajov zautomatizuje.

Ďakujem za tipy. Robím v Pythone a R-ku.

Obrázek
Tričko AVmánie :lol:

"Ovocné víno každý den, tvůj život se změní ve zlý sen."
creat
Junior
Uživatelský avatar

Odeslat příspěvekod Nargon 15. 6. 2018 14:33

Asi ti můžu jen popřát hodně štěstí.
Teoreticky to není neřešitelné. Rozhodně se nesnaž upravovat ten výsledný txt soubor. Raději si vytvoř aplikaci, která ze zadaného vstupního souboru vygeneruje výstupní soubor v požadovaném formátu. Vyhneš se tak problémům, že někdo špatně upravil ten txt soubor a při přepisování hodnoty tam zůstane část původního čísla a hodnota v txt souboru bude chybná.
Co jsem tak rychle googlil tak knihovny pro čtení excelu jsou, tak s tímto to budeš mít celkem snadné. Ale co se na to tak dívám tak absolutně nechápu provázanost mezi hodnotami. Například jsem se díval na hodnotu 19.650, kterou máš o dva řádky víš v tom txt souboru, ale ať koukám, jak koukám, tak ve sloupci I toho excelu nikde není, a hodnotu 19.65 nevidím ani nikde jinde v tom excelu. Ty to asi víš co s tím, když s tím každý čtvrtek děláš, ale pro nezasvěcence v tom žádnou logiku nevidím a tedy ti nemám co poradit, když nevím jak to přepisování probíhá.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod JirkaVejrazka 15. 6. 2018 17:57

V Pythonu pouzij knihovnu openpyxl nebo xlrd. Jak pise Nargon, potrebujes ten vysledny TXT soubor generovat, ne upravovat existujici.

Trochu mi unika smysl, ale to je tvoje vec. Bez konkretnejsich udaju ti nikdo vic neporadi, ta jedna sipka na obrazku nic neznamena, tezko z toho usuzovat jak velka cast toho TXT souboru pochazi z dat, ktera byla puvodne v Excelu.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod creat 16. 6. 2018 10:25

Ďakujem za odpoveď. Tak, čo sa týka zmyslu, TXT súbor má preto špeciálnu štruktúru, pretože z neho berie údaje a hodnoty softvér na výpočet elektrických sieti. Lenže keď mi prídu nové namerané hodnoty napríklad zo 120 odberných miest v exceli, tak ja musím prácne hľadať v txt konkrétne súradnice hodnôt, prepísať ich, uložiť, načítať do softvéru a urobiť výpočet. TXT súbor má vyše 4 000 riadkov a desiatky stĺpcov. Pohrám sa openpyxl a uvidím.

Margon -> Čo sa týka excelu, tak aby to nebolo tak jednoduché, excel obsahuje 11 tabuliek, takže tá hodnota 19.650 tam je, len v inej tabuľke...

Díky, ale vyzerá to tak, že sa asi nepohnem moc dopredu :-(
Tričko AVmánie :lol:

"Ovocné víno každý den, tvůj život se změní ve zlý sen."
creat
Junior
Uživatelský avatar

Odeslat příspěvekod Nargon 16. 6. 2018 22:15

Co se týče vytvoření toho výstupního souboru tak je to celkem snadné. Jediné co musíš tak formátovat čísla na pevnou délku, tj 3 desetinné pozice a celý text doplňovat zleva mezerami na pevnou délku cca 10 znaků (záleží na konkrétním místě v txt souboru) a pak už jen lepíš jednotlivé hodnoty dohromady. A sem tam vložíš nový řádek.
Načítání excel souboru je také celkem snadné, na to jsou ty knihovny, práce s nimi je celkem jednoduchá. Otevřeš soubor, otevřeš list a pak můžeš celkem snadno číst ze souřadnic (sloupec a řádek).
Ta nejtěžší část podle mě je načíst správnou hodnotu ze vstupního souboru. Zde záleží jakou variabilitu má ta hodnota. Vezmu například tu hodnotu 47.250, pokud se vždy nachází na stejné pozici, tj například sešit číslo 3, sloupec I, řádek 167 tak to máš snadné. Jen do kódu programu tuhle pozici budeš muset zapsat. A stejně tak pro všechny ostatní hodnoty. Horší to je v případě, že hodnota pevnou pozici nemá, ale nějak se mění. Například řádek 167 neplatí, ale je variabilní, pak musíš vyhledat nějaký identifikátor podle kterého to poznáš. Tohle já netuším, to záleží na tom co s tím vždy děláš, takže by to pro tebe nemělo být složité. Takže například musíš ve sloupci A vyhledat hodnotu "B" a to ti určí ten správný řádek a pak na tom řádku vezmeš sloupec I a máš tu hodnotu co budeš zapisovat do výstupu.
Z pohledu principu je to celkem snadné, ale mě osobně by se s tím nechtělo dělat protože v tom výstupním souboru je fakt hodně čísel a při představě, že každé takhle mapuji a vyhledávám tu správnou pozici na základě nějakých dalších hodnot, navíc těch hodnot vidím cca 200 (odhad), tak to se s tím programem budeš dělat tak dva týdny.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod DanHen 17. 12. 2018 16:46

presne toto som riesil minuly tyzden (resp. nieco velmi pobodne)
python ma openpyxl kniznicu, ktora operuje s xls subormi. zerie mi to xls, xlsx a aj xlsm subory.
snad neporusim pravidla, ak postnem svoju proceduru na konverziu xls to listu.

Kód: Vybrat vše
from openpyxl import load_workbook

# PRECITA ZADANY SHEET ZO ZADANEHO EXCEL SUBORU A VRATI AKO LIST
def ReadExcelData(e_file:str, e_sheet:str, SkipFirstRow:bool=False):
    # ak je prva cell v riadku prazdna, usudi, ze je to koniec celeho sheetu
    # ak je niektora ina cell v riadku prazdna, riadok ukonci na tejto cell, usudi, ze je to koniec stlpca a pokracuje do dalsieho riadku
    print("READING EXCEL DATA ...   please wait ...")

    # variables
    excel_file = load_workbook(e_file)
    excel_sheet = excel_file[e_sheet]
    rowsMax=0
    colsMax=0
    row=0
    break_cols=False
    break_rows=False

    # nadefinovanie prazdneho listu. 9999 riadkov by malo stacit :)
    l_result=[]
    for ii1 in range(1,9999):
        l_result.append(None)

    # cyklus pre riadky
    while True:
        row=row+1
        col=0
        l_col=[]

        # cyklus pre stlpce
        while True:
            col=col+1
            cell = excel_sheet.cell(row=row, column=col).value
            #print("row: " + str(row) + "   / col: " + str(col) + "   / cell: " + str(cell))

            if cell==None: # ak je cell prazdna, rozhodni, co sa ma diat dalej
                if col==1: # vyzera to, ze je celkovy koniec udajov, kedze prvy stlpec v danom riadku je prazdny
                    break_rows=True
                else: # toto vyzera ako koniec stlpcov, ale nejake riadky este mozno su
                    break_cols=True

            else: # cell nie je prazdna. zapis hodnotu zo cell do listu
                l_col.append(str(cell))

            # koniec stlpcov pre dany riadok. resetni premennu a pokracuj dalej
            if break_cols==True:
                break_cols=False

                # ak je pocet max stlpcov nulovy, napln max hodnotu pre stlpce (toto sa udeje len prvy krat)
                if colsMax==0:
                    colsMax=col
               
                break

        # vloz aktualny riadok do listu
        l_result[row]=l_col

        # totalny koniec
        if break_rows==True:
            break_rows=False
            if rowsMax==0:
                rowsMax=row
            break

    # vymaz prvy item z listu. list je od nulteho indexu, ale ja naplnam udaje az od jednotky, prva bunka je teda 1:0, a nie 0:0.
    # takze prvy item, ktory je VZDY NONE vyhod von. takisto zniz celkovy pocet riadkov o jedna
    l_result.pop(0)
    rowsMax=rowsMax-1

    # ak je SkipFirstRow=true, vyhod prvy riadok z listu (aby list neobsahoval hlavicku zo sheetu). tiez odpocitaj jedne riadok
    if SkipFirstRow==True:
        l_result.pop(0)
        rowsMax=rowsMax-1

    # uprava vysledneho listu (vyhadzanie NONE riadkov)
    l_results=[]
    for ii1 in range(0,rowsMax):
        l_results.append(l_result[ii1])

    # hotovo :) vysledny list je samozrejme od nulteho indexu, takze prva bunka je 0:0
    print("READING EXCEL DATA ...   D O N E !")
    return l_results



fciu jednoducho zavolas:
list_excel=ReadExcelData("myfile.xls", "MySheet", True)
kde v list_excel mas vrateny list, ktory obsahuje cells zo sheetu. vidim, ze mas aj prazdne cells, tak si to budes musiet upravit, a prestudovat, ako to funguje. toto som si napisal pre seba a pre moje potreby, uprav si to, ako uznas za vhodne :)

EDIT: pardon, vidim, ze vlakno je stare pol roka, asi je to uz passe ...
jedine smrt ve svete nespecha,
prichazi pomalu a v klidu
                                (kryptor)
http://danhen.lordcyber.net/
DanHen
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků