Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Pomoc s napsanim skriptu pro trideni/formatovani textu [VYRESENO]  (Přečteno 2194 krát)

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 222
Zdravim, potreboval bych po nejake dobe trosku (vic) poradit:

Jde o to, ze bych potreboval napsat (predpokladam) principielne jednoduchy skript na trideni textu. Jde mi o to, ze mam nasledovne "zakodovany" vypis z ridici stanice vytapeni:
Kód: [Vybrat]
#STA:000000,511;L:278;TM:23/08/2011,08:45:01;D:1;T:01;C:42;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:10.87;
STA:000000;A08:00000;A09:27.93;A10:32.06;A11:48.56;A12:45.56;A13:-0.06;A14:15.56;P01:00000000;P02:00000000;P03:00000000;K01:13330000000000000;O01:0000;15#
#STA:000000,511;L:278;TM:23/08/2011,08:40:00;D:1;T:01;C:41;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:11.00;
STA:000000;A08:00000;A09:29.68;A10:32.00;A11:48.62;A12:45.81;A13:-0.06;A14:15.81;P01:00000000;P02:00000000;P03:00000000;K01:13330000000000000;O01:0000;17#
Tento kod bych ale rad interpretoval, cili aby terminal text "precetl" a podle kriteria vypsal. Cili, mel by vyhledat hodnotu mezi 2ma urcenymi znaky a vepsat ji (napr. hodnota mezi ""#STA:" a nejblizsi "," nebo ";" = "Cislo zarizeni: "hodnota""), pricemz pocatek hledani by byl vzdy cely text az po znak, kterym predchozi hledani koncilo - Pr: Pocatek "#STA:000000," a konec nejblizsi "," od pocatku, vepsat do napr. "teplota=   x   ºC" a tak dale, az by se znakem "#" zacal novy radek...
Potreboval bych v tomto ohledu dost poradit, nikdy jsem zadny skript, ktery by musel pracovat s textem nepsal (me maximum bylo skriptovani automatickeho restartu programu).
Nechci, aby to vypadalo, ze to ma nekdo napsat za me, pomuze mi i odkaz na nejake misto, kde bych se dozvedel prislusne prikazy (v podstate neco jako "najdi text mezi A a B a vypis ho za XXX, najdi text mezi A + vysledek minuleho hledani + B a C a vypis....") a jak je nastavit, kazdopadne cim vice informaci, tim lepe...
Predem moc dekuji!
« Poslední změna: 25 Září 2011, 15:28:19 od Václav Sobota »


Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 222
Re: Pomoc s napsanim skriptu pro trideni/formatovani textu
« Odpověď #2 kdy: 24 Srpna 2011, 23:48:54 »
Citace
Napsal bych něco konkrétnějšího, ale moc jsem to nepochopil. Dáš příklad jak to má fungovat?
Jiste, dekuji za pomoc - konkretne tady rozepisu jednu zpravu. Nejprve zdroj, potom "legendu" a nakonec (priblizny) pozadovany vystup:
ZDROJ:
Kód: [Vybrat]
#STA:000000,511;L:278;TM:23/08/2011,08:45:01;D:1;T:01;C:42;A00:00000;A01:00000;A02:00000;A03:00000;A04:00000;A05:00000;A06:00000;A07:10.87;
STA:000000;A08:00000;A09:27.93;A10:32.06;A11:48.56;A12:45.56;A13:-0.06;A14:15.56;P01:00000000;P02:00000000;P03:00000000;K01:13330000000000000;O01:0000;15#
VYKLAD KODU:
Kód: [Vybrat]
# = pocatek zpravy *(jako pocatek by bylo mozne uvazovat i #STA: - je nemenne)
; = oddelovac udaju
STA:000000,511 = Merici jednotka: 511
L:278 = Znaku v paketu: 278
TM:23/08/2011,08:45:01 = Datum a cas zaznamu: 23/08/2011,08:45:01
D:1 = Interval mereni: 1 *(1=5min, 2=15 min. atd.)
T:01 = Zaznamu v paketu: 01
C:42 = Nahranych paketu: 42
A00:00000 = Vlhkost: 00000
A01:00000 = Vystup senzoru A01: 00000
A02:00000 = Vystup senzoru A02: 00000
... .. ... ... *(atp.)
A07:10.87 = Vystup senzoru A07: 10.87
STA:000000 = bez podstatneho vyznamu
A08:00000 = Vystup senzoru A08: 00000
A09:27.93 = Vystup senzoru A09: 27.93
... .. ... ... *(atp.)
A13:-0.06 = Vystup senzoru A13: -0.06
A14:15.56 = Vystup senzoru A14: 15.56
P01:00000000 = Kumulovany pocet pulzu: 00000000
... .. ... ... *(atp.)
K01:13330000000000000 = Status zarizeni: 13330000000000000 *(1 jako prvni cislice znaci ON, 0 znaci OFF. Zbytek nedulezite)
O01:0000 = Digitalni vystup: 0000 *(nedulezite)
15 = Parita: 15 *(nedulezite)
# = Konec zpravy
PRIKLAD VHODNEHO VYSTUPU:
Kód: [Vybrat]
Cislo zarizeni: 511
Cas mereni: 23/08/2011,08:45:01
Interval mereni: 5 min.
Merena vlhkost: 00000
Senzor A01: 00000 ºC Senzor A02: 00000 ºC Senzor A03: 00000 ºC Senzor A04: 00000 ºC
Senzor A05: 00000 ºC Senzor A06: 00000 ºC Senzor A07: 10.87 ºC Senzor A08: 00000 ºC
Senzor A09: 27.93 ºC Senzor A10: 32.06 ºC Senzor A11: 48.56 ºC Senzor A12: 45.56 ºC
Senzor A13: -0.06 ºC Senzor A14: 15.56 ºC
Senzor P01: 00000000 pulsu Senzor P02: 00000000 pulsu Senzor P03: 00000000 pulsu
Jde mi v podstate o to, aby skript ten kodovany vstup "rozsifroval" a "okomentoval" ty jednotlive hodnoty zhruba podle toho prikladu, co jsem uvedl. Na tom grafickem poradku ale zas tolik nezalezi...
Dekuji za uzitecne odkazy a budu vdecny za jakoukoliv dalsi pomoc.

Edit: Tak musim rict, ze ten clanek o nahrazovani textu pomoci sedu mi velice pomohl, moc dekuji. Rad bych se jeste nejak vyporadal s tim formatovanim, takze pokud by byla nejaka rada (i) v tomto ohledu, uvital bych ji. Pro informaci prikladam zdrojovy soubor, muj "prekladac" a jeho vystup :)

[attachment deleted by admin]
« Poslední změna: 25 Srpna 2011, 02:40:29 od Václav Sobota »

pacholik

  • Závislák
  • ***
  • Příspěvků: 2072
Re: Pomoc s napsanim skriptu pro trideni/formatovani textu
« Odpověď #3 kdy: 25 Srpna 2011, 16:54:07 »
Tak to bych všechno nějak naplácal do proměnných a naformátoval pomocí printf. Ale to už by možná bylo lepší napsat v C nebo v Pythonu.

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re: Pomoc s napsanim skriptu pro trideni/formatovani textu
« Odpověď #4 kdy: 25 Srpna 2011, 17:19:24 »
to nejjednodussi reseni pro parsovani .cvs v perlu:

Kód: [Vybrat]
use strict;
use warnings;

my $current_line;
sub process_line {
        my @line = split(q/;/, $current_line);
        return(@line)
};

^^ tohle ti vytvori pole s pevnim poradim prvku ze vstupni lajny ;) .. idealni by bylo anonymni hashe ale takhle to staci .. prvkum pristupujes pomoci indexu:

Kód: [Vybrat]
$current_line = $foo;
my @line = process_line();

## $line[0] je prvni, $line[-3] je druhej od konce, apod

jinak priklad s vytvorenim hashe je zde:

Kód: [Vybrat]
sub build_struct_hash {
        my %struct_hash;
        foreach(read_csv()) {
                my($pos_xy, $pos_str) = split(/;/, "$_");
                $pos_xy =~ s/\D//g;
                $pos_str =~ s/\r//g; chomp($pos_str);
                my $len = length($pos_xy);
                $struct_hash{$pos_xy} = {};
                $struct_hash{$pos_xy}->{'str'} = $pos_str;
                $struct_hash{$pos_xy}->{'parent'} = substr($pos_xy, 0, ($len - (sqrt(4*$len+1)-1)));
                $struct_hash{$pos_xy}->{'plen'} = length($struct_hash{$pos_xy}->{'parent'});
        };

        return %struct_hash;
};

^^ tady stejnym zpusobem zpracovavam *pouze dvouclenej vstup a vytvarim anonymni reference podle toho co prijde jako  $struct_hash{$pos_xy} .. pristup k obsahu je

Kód: [Vybrat]
keys(%struct_hash);
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 222
Re: Pomoc s napsanim skriptu pro trideni/formatovani textu - ntz_reloaded
« Odpověď #5 kdy: 25 Srpna 2011, 21:01:57 »
Diky moc za radu, ale popravde se v tom moc nevyznam - v pearlu jsem nikdy nic nedelal. Asi se to pokusim dodelat pomoci sed, awk a printf, pricemz bych se na ten tvuj postup zameril pozdeji - urcite (jestli jsem te dobre pochopil) mi nabidne sirsi spektrum moznosti, takze si myslim, ze urcite stoji za to se naucit pracovat i s timhle.

V soucasne dobe vlastne jenom trochu bojuju se spojovanim radek pomoci sed a pak uz mi zbyde jenom formatovani. Ale rad bych zkusil ten skript aplikovat napr. na cely obsah slozky - dalo by se pouzit neco jako
Kód: [Vybrat]
$ /home/user/Dokumenty/skript ls -l '/home/user/Dokumenty/Zaznamy/'? Spojovoani prikazu, to je pro me orisek (a nebo je v tom mym ubuntu 10.10 - obcas tu nefunguji prikazy, tak jak bych [nejen ja] predpokladal... :D )

Kazdopadne dekuju za jakoukoliv pripadnou dalsi radu - jsem zacatecnik (oproti vetsine zdejsi prispevatelu), ale zapalenej :)

pacholik

  • Závislák
  • ***
  • Příspěvků: 2072
Re: Pomoc s napsanim skriptu pro trideni/formatovani textu
« Odpověď #6 kdy: 25 Srpna 2011, 22:12:26 »
jako s polem s tím můžeš pracovat i v bashi
Kód: [Vybrat]
#!/bin/bash

tisk() {
IFS=";,:" #nastaví oddělovače
a=$1 #pole
printf "Cislo zarizeni:\t${a[2]}\n"
printf "Cas mereni:\t${a[6]},${a[7]}:${a[8]}\n"
interval=(0 5 15 30 60)
printf "\t\t\t\t\tInterval mereni:\t${interval[${a[11]}]} min.\n"
printf "\tMerena vlhkost:\t${a[17]}\n"
printf "...\n\n"
}

vstup=(`head -n2 "$1"`) #první dva řádky ze souboru zadaného parametrem
tisk vstup
použití pro konkrétní soubor a pro všechny soubory ve složce
Kód: [Vybrat]
$ skript cesta/soubor
$ for i in cesta/složka/*; do skript "$i"; done

E: něco o bashi: http://www.abclinuxu.cz/serialy/bash
« Poslední změna: 25 Srpna 2011, 22:15:50 od pacholik »

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 222
Re: Pomoc s napsanim skriptu pro trideni/formatovani textu
« Odpověď #7 kdy: 26 Srpna 2011, 18:49:14 »
Tak nakonec jsem vsechno to formatovani zvladnu v sedu - doslo mi, ze 3 sloupce (1. nazvy, 2. hodnoty, 3. budou lepsi pro export do Calcu - umi prevest tabulatorove oddeleni na sloupce), takze by potom bylo mozne delat grafy... :D

Udelal jsem to nasledovne:

Mam skript Interpret, ktery "prelozi" vychozi kod, podleze skript Stylista1, ktery provede zakladni upravy prekladu, pak skripty Stylista2 a Stylista3, ktere provedou dalsi dilci upravy nasledne (zatim pouze uvaha) by skript Printer virtualne vytiskl cely vystup. Posleze skript Exportér4 (ten uz mam) naposledy zformatuje vystup tak, aby se Calcu dobre "cetl" (oddeli popis jednotek tabulatorem) - opet kvuli eventualnim grafum. (PS: Vim ze by to mohlo byt v zasade vse v jednom skriptu, ale dohromady mi to nefungovalo, jak jsem potreboval - jako by bash chtel spoustet vsechno najednou)

Musim jeste udelat skript Manazer, ktery bude ty vyse zminene postupne spoustet ( + na zacatku vytvori slozku pro ulozeni prechodnych souboru, kterou pak na konci smaze). Jenom mi dela starosti:
1. Pokud budu ty skripty chtit pouzit na celou slozku podle
Kód: [Vybrat]
$ skript cesta/soubor
$ for i in cesta/složka/*; do skript "$i"; done
vypadalo by to zrejme takhle:
Kód: [Vybrat]
$ Interpret '/home/user/CodeInterpret/Interpret'
$ for i in '/home/user/CodeInterpret/Import/*'; do Interpret "$i"; done
, je to v poradku? Pokud ano, predpokladam ze bych mel z Interpretu  (a dlasich) odstranit '/home/user/BRITEC/Datalogger_report.txt' > '/home/user/Plocha/The_Decoding_Result.txt' (cestu k souborum), je to tak?
2. Pojmenovani - nejak vubec nevim, jak vyresit pojemenovani - napr. by se mi hodilo, kdyby ten skript ponechal puvodni jmeno, jenom pridal predponu nebo priponu.

Diky za kazdou radu :)

[attachment deleted by admin]
« Poslední změna: 26 Srpna 2011, 18:53:58 od Václav Sobota »

pacholik

  • Závislák
  • ***
  • Příspěvků: 2072
Re: Pomoc s napsanim skriptu pro trideni/formatovani textu
« Odpověď #8 kdy: 27 Srpna 2011, 17:27:17 »
no projdi si ten seriál o bashi, hlavně asi třetí a čtvrtej díl se ti bude hodit

Václav Sobota

  • Aktivní člen
  • *
  • Příspěvků: 222
Re: Pomoc s napsanim skriptu pro trideni/formatovani textu
« Odpověď #9 kdy: 21 Září 2011, 21:17:06 »
Opet po dlouhe dobe zdravim! Byl jsem posledni tydny hodne vytizeny a tak jsem nemel vubec cas se venovat tomuto tematu, nicmene dnes jsem se do toho ve chvilce volna pustil a tady prinasim funkcni skript, kteri se mi podarilo vytvorit. Pozdeji ho trochu "zracionalizuji" a vylepsim. Nicmene, funguje tak, jak je.
Kód: [Vybrat]
#!/bin/bash
# Skript k interpretaci, serazeni a formatovani textovych reportu z GSMS-THV Data Loggeru

# Kopirovani vsech souboru ve slozce do jine slozky
cp /home/user/Plocha/NEW/Vstup/* /home/user/Plocha/NEW/Vystup/
# '*' = vsechny soubory;
# za '.../Vystup/' nechat prazde = do adresare

# Uprava VSECH souboru ve slozce ("online", bez vytvareni novych souboru) pomoci sedovych parametru v souboru .sed
# 1. Interpret
sed -i -f '/home/user/Plocha/NEW/Interpret.sed' /home/user/Plocha/NEW/Vystup/*

# 2. Stylista 1
sed -i -f '/home/user/Plocha/NEW/Stylista1.sed' /home/user/Plocha/NEW/Vystup/*

# 3. Stylista 2
sed -i -f '/home/user/Plocha/NEW/Stylista2.sed' /home/user/Plocha/NEW/Vystup/*

# 4. Stylista 3
sed -i -f '/home/user/Plocha/NEW/Stylista3.sed' /home/user/Plocha/NEW/Vystup/*

# 5. Exportér
sed -i -f '/home/user/Plocha/NEW/Exportér4.sed' /home/user/Plocha/NEW/Vystup/*

# prvni vzdy '-i' a az potom '-f', obracene nefunguje
Pricemz jednotlive soubory .sed jsou nasledujici:
INTERPRET:
Kód: [Vybrat]
s/#STA:000000,/START OF STATEMENT! Device number: /
s/;L:/; Number of characters in packet: /
s/;TM:/; Time of statement: /
s/;D:/; Reporting interval: /
s/; Reporting interval: 1;/; Reporting interval: 5 min.;/
s/; Reporting interval: 2;/; Reporting interval: 15 min.;/
s/; Reporting interval: 3;/; Reporting interval: 30 min.;/
s/; Reporting interval: 4;/; Reporting interval: 60 min.;/
s/; Reporting interval: 5;/; Reporting interval: 1 min.;/
s/;T:/; Records in packet: /
s/;C:/; Uploaded packets: /
s/;A00:/; Humidity: /
s/;A01:/; Sensor A01: /
s/;A02:/ºC;A02:/
s/;A02:/; Sensor A02: /
s/;A03:/ºC;A03:/
s/;A03:/; Sensor A03: /
s/;A04:/ºC;A04:/
s/;A04:/; Sensor A04: /
s/;A05:/ºC;A05:/
s/;A05:/; Sensor A05: /
s/;A06:/ºC;A06:/
s/;A06:/; Sensor A06: /
s/;A07:/ºC;A07:/
s/;A07:/; Sensor A07: /
s/STA:000000;A08:/ºC;A08:/
s/;A08:/; Sensor A08: /
s/;A09:/ºC;A09:/
s/;A09:/; Sensor A09: /
s/;A10:/ºC;A10:/
s/;A10:/; Sensor A10: /
s/;A11:/ºC;A11:/
s/;A11:/; Sensor A11: /
s/;A12:/ºC;A12:/
s/;A12:/; Sensor A12: /
s/;A13:/ºC;A13:/
s/;A13:/; Sensor A13: /
s/;A14:/ºC;A14:/
s/;A14:/; Sensor A14: /
s/;P01:/ºC;P01:/
s/;P01:/; Sensor P01: /
s/;P02:/ pulses;P02:/
s/;P02:/; Sensor P02: /
s/;P03:/ pulses;P03:/
s/;P03:/; Sensor P03: /
s/;K01:/ pulses;K01:/
s/;K01:/; Device status: /
s/; Device status: 1/; Device status: ON, Port status /
s/; Device status: 0/; Device status: OFF, Ports: /
s/;O01:/; Digital Output status (0 = open, 1 = closed): /
s/;1/; Parity check: 1/
s/;2/; Parity check: 2/
s/;3/; Parity check: 3/
s/;4/; Parity check: 4/
s/;5/; Parity check: 5/
s/;6/; Parity check: 6/
s/;7/; Parity check: 7/
s/;8/; Parity check: 8/
s/;9/; Parity check: 9/
s/;0/; Parity check: 0/
s/#/; END OF STATEMENT!/
STYLISTA1:
Kód: [Vybrat]
s/^ºC//
s/START OF STATEMENT! /START OF STATEMENT!\n/g
s/; /\n/g
s/: / /g
s/^[ \t]*//
s/END OF STATEMENT!/END OF STATEMENT!\n/g
STYLISTA2:
Kód: [Vybrat]
s/;/ºC/g
/./!d
STYLISTA3:
Kód: [Vybrat]
/START OF STATEMENT/{x;p;x;}EXPORTÉR4:
Kód: [Vybrat]
s/ºC/ ºC/g
s/ pulses/ pulses/g
Zdrojovy soubor je mozne stahnout z predchozich prispevku.
Dekuji obema prispevatelum za pomoc a nepohrdnu zadnou dalsi radou, v pripade dalsiho vyvoje se na Vas s dovolenim znovu obratim :)

 

Provoz zaštiťuje spolek OpenAlt.