Portál AbcLinuxu, 12. května 2025 06:42

Dotaz: Pomoc s prvním skriptem

29.12.2006 21:29 Jack Hokus | skóre: 34 | blog: LostHeaven
Pomoc s prvním skriptem
Přečteno: 142×
Odpovědět | Admin
Ahoj,

mám následující problém. Potřeboval bych pomoct s vytvořením skriptu, který by mi pomohl "uklidit" knihu odeslané pošty.

Jedná se o tabulku, která bylá původně zamýšlena tak, že na každé stránce byla jedna tabulka po 30 řádcích, na začátku hlavička konci součet.

Vše bylo navrženo tak, aby když to celé vytisknete a založíte k archivaci byl na každém listu jedna tabulka s hlavičkou na začátku a součtem na konci.

Jenomže se u toho vystřídala spousta lidí a výsledkem je totální zmatek.

Potřeboval bych sestavit kolonu příkazů, která by dělala následující.

Nejprve dostat tu sadu tabulek do nějakého ke zpracování vhodného tvaru. Ale pozor, struktura jednollivých řádků musí zůstat nedotčená.

Jednotlivé řádky jsou složeny z data, jména příjemce,jeho adresy, obsahu spisu a poznámky Potom vypsat obsah tohoto souboru tak aby výstupem bylo třicet řádek. Výstup si pak zkopíruju do příslušné tabulky.

Nechci nikomu hodit na krk svou vlastní práci. Vím, co chci, ale nevím, jak toho dosáhnout. Nikdy jsem žádny skript nepsal. Budu rád za jakoukoliv radu.

S pozdravem Jack Hokus
http://www.jackhokus.cz/
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

29.12.2006 23:03 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Pomoc s prvním skriptem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Formát (typ súboru) tej pôvodnej tabuľky je aký?
29.12.2006 23:42 Jack Hokus | skóre: 34 | blog: LostHeaven
Rozbalit Rozbalit vše Re: Pomoc s prvním skriptem
Dobrý večer,

tabulka je vytvořená v MS Excelu, takže .xls.

Děkuji za odpověď

Jack Hokus
http://www.jackhokus.cz/
29.12.2006 23:51 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Pomoc s prvním skriptem
Aby sa to dalo spracovávať skriptom, muselo by to byť v nejakom (najlepšie textovom) formáte. Jedna z možností je uložiť to ako .csv (treba ale zvoliť vhodný oddeľovač stĺpcov [nejaký znak, ktorý v tých údajoch nie je použitý]).
30.12.2006 00:07 Jack Hokus | skóre: 34 | blog: LostHeaven
Rozbalit Rozbalit vše Co jsem zatím zkoušel
Dobrý večer,

původně excelovou tabulku jsem otevřel v OpenOffice a přes Soubor, Uložit jako záložka typ souboru a v ní export textu (nastavitelný) jsem si tabulku převedl na textový soubor.

Tento textový soubor jsem pomocí příkazu: $ split --lines 30 pokus2.txt rozdělil na jednotlivé soubory po 30 řádcích (jedna strana v knize pošty má mít 30 řádků).

Z malé části to tedy funguje, myslím tím převedení tabulky na textový soubor, a rozdělení souboru na části po 30 řádcích

Ještě musím přijít na to, jak odfiltrovat nežádoucí řády (záhlaví a zápatí jednotlivých tabulek, prázdné řádky),tak aby výsledkem byl soubor s obsahem v tomto tvaru:
1.12. Karel Janota Široká 15 772 00 Olomouc oběžník 1 12
Toto celé má být na jednom řádku, čísla na konci znamenají 1 ks známky za 12 Kč

To je zatím vše. Zítra na to sednu. Zatím dobrou noc a poděkování všem předsilvestrovským sovám.

Jack Hokus
http://www.jackhokus.cz/
30.12.2006 00:29 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Co jsem zatím zkoušel
Ak sú tam iba medzery, bude ťažké určiť, čo patrí do akého stĺpca. Preto je lepšie použiť csv (comma-separated values).

Na odfiltrovanie prázdnych riadkov (alebo obsahujúcich iba medzery) sa dá použiť
grep -vx '[[:space:]]*' pokus2.txt
(samozrejme ešte pred rozdelení súboru).

Na odstránenie hlavičiek a pätičiek sa dá použiť podobný postup (závisí od toho, čo takéto riadky obsahujú).
30.12.2006 16:45 Jack Hokus | skóre: 34 | blog: LostHeaven
Rozbalit Rozbalit vše Re: Co jsem zatím zkoušel
Dobrý den,

vámi uvedený postup funguje perfektně. Prošel jsem si ho kus po kusu, abych pochopil jak jste to sestavil.
grep  Hledá řádky, které odpovídají zadanému výrazu 
v     Vypisuje řádky, které neodpovídají zadanému vzoru 
x     Řádek je vypsán pouze tehdy, pokud celý odpovídá zadanému vzoru
Až sem tomu rozumím, ale nepochopil jsem tuto část
 '[[:space:]]*'
Přesněji, odhaduju, že tímto jste zadal, že má hledat prázdné řádky, ale nic víc.

Asi se teď chytáte za hlavu nad mou natvrdlostí, protože nechápu něco tak jednoduchécho, ale opravdu jsem nikdy nenapsal žádný skript, ani se nepokoušel programovat tak zatím na celou věc hledím se stejným pochopením jako politik na lopatu.

Moc děkuju za dosavadní trpělivost a přeju pěknou sobotu

Jack Hokus
http://www.jackhokus.cz/
30.12.2006 16:56 Pavel1 | skóre: 33
Rozbalit Rozbalit vše Re: Co jsem zatím zkoušel
Hledej "regulární výrazy". Najdeš toho mraky. Toto konkrétně znamená žádná, nebo jedna, nebo více mezer (stejný zápis: ' *' ).
30.12.2006 17:03 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Co jsem zatím zkoušel
[:space:] nemusí byť len ' '
30.12.2006 18:05 Pavel1 | skóre: 33
Rozbalit Rozbalit vše Re: Co jsem zatím zkoušel
Jo, jasně, já jsem to hooodně zjednodušil, až moc ...
30.12.2006 17:00 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Co jsem zatím zkoušel
[:space:] znamená nejaký typ medzery (normálna medzera, tab...)

[]* je 0 a viac výskytov

Teda celé to je (aj s tým -x), riadky, kde je 0 a viac medzier

Ak hlavičky a pätičky nemajú na začiatku dátum, môžu sa odfiltrovať napr.
egrep '^[[:space:]]*[[:digit:]]+.[[:digit:]]+'
teda: na začiatku radku môžu byť medzery (keďže je tam * tak aj nemusia), potom aspoň jedna číslica (to je to +), bodka a zase aspoň jedna číslica
30.12.2006 17:05 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Co jsem zatím zkoušel
Na vyhodenie tých prázdnych riadkov je možno lepšie
grep '[^[:space:]]' a.txt
to vypíše riadky, ktoré obsahujú aj iné znaky ako medzera
31.12.2006 10:30 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Co jsem zatím zkoušel
Zdravím,

zkusil jsem při exportu do CSV nastavit jako oddělovač tabelátor (zdá se mi to jistější než čárka). No a výsledný soubor "janota.csv" jsem pak zpracoval tímhle:
#!/usr/bin/env python
# -*- coding: utf-8
cell_names = ['Jméno', 'Ulice', 'PSČ', 'Město', 'Zásilka']
N = 5
count = 0
for line in file('janota.csv'):
    line = line.strip()
    cells = line.split('\t')
    if len(cells) != len(cell_names): continue
    count += 1
    if count > N:
        print
        count = 1
    print count
    for name, cell in zip(cell_names, cells):
        cell = cell.replace('"', '')
        print name, cell
Jednotlivé buňky mám pojmenované a pokud počet buněk v řádku nesouhlasí s počtem jmen, tak celý řádek zahodím (to budou asi ty hlavičky, patičky, prázdné řádky atd.). Dále se jednotlivé řádky číslují a rozdělují do N-tic. Výstup u každého řádku vypadá zhruba takto:
3
Jméno Karel Janota
Ulice Široká 15
PSČ 772 00
Město Olomouc
Zásilka Oběžník
V této podobě je to samozřejmě k ničemu, je to pouze ukázka principů pro inspiraci. S jednotlivými buňkami se dá dělat ledacos.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.