Extrahovani zvolenych udaju z .txt souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Extrahovani zvolenych udaju z .txt souboru – C / C++ – Fórum – Programujte.comExtrahovani zvolenych udaju z .txt souboru – C / C++ – Fórum – Programujte.com

 

JohnyD
~ Anonymní uživatel
4 příspěvky
20. 8. 2007   #1
-
0
-

Zdravim, pujdu hned na vec, mam .txt soubor s obbsahem napr:
-------------------------------------------------------------------------
---bladsasda text: ahoj obsah: cau.cau pripona: txt blasdadsbla ---
---blaasdasdla bla text: ahoj1 obsah: cau.cau1 pripona: txt blaasdasdbla ---
---blasdasd bla bla text: ahoj2 obsah: cau.cau2 pripona: txt bla asdasda ---
-------------------------------------------------------------------------

a chtel bych vytvorit do druheho souboru toto:
ahoj,cau.cau,txt
ahoj1,cau.cau1,txt
ahoj2,cau.cau2,txt

proste aby se vzala jen hodnota za "text: ", "obsah: " a "pripona: "

diky moc...

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
21. 8. 2007   #2
-
0
-

Na toto je idealna pcre kniznica a regularne vyrazy. Pisal som o nej clanok len neviem ci este vysiel.Inac program by mohol vyzerat uplne jednoducho. Ja len napisem funkciu ktorej predas riadok a ona ti to ulozi do streamu.



#include <iostream>
#include <pcre.h>

#define VEC_SIZE 30
#define BUF_SIZE 255
#define REG_EXP = "text: (.+) obsah: (.+) pripona: ([^ ]+)"

using namespace;


...

int getSubstrFromRe(char* line, int* ovector, int pos, char* out, int out_size)
{
char* substr_start;
int substr_size = 0;

substr_start = line + ovector[(2*pos)];
substr_size = ovector[(2*pos)+1] - ovector[(2*pos)];
if (substr_size >= out_size) {
return 0;
}

memset(out, '\0', out_size);
memcpy(out, substr_start, substr_size);
return 1;
}

int convert(const char* line, istream& strm)
{
pcre* re_handle = NULL;
int res = 0;
const char* err;
int err_offset;
int ovector[VEC_SIZE];
char sub[BUF_SIZE];

//kompilacia reg.vyrazu
re_handle = pcre_compile(REG_EXP, 0, &err, &err_offset, NULL );
if (!re_handle) {
printf("ERROR reg.exp.: %s", err);
return 0;
}

//vykonanie reg. vyrazu
res = pcre_exec(re, 0, line, strlen(line), 0, 0, ovector, VEC_SIZE);
if (res < 0) {
return 0;
}

//pristup k subvyrazom
getSubstrFromRe(line, ovector, 1, sub, BUF_SIZE);
strm << sub << ",";

getSubstrFromRe(line, ovector, 2, sub, BUF_SIZE);
strm << sub << ",";

getSubstrFromRe(line, ovector, 3, sub, BUF_SIZE);
strm << sub << endl;

pcre_free(re_handle);
return 1;
}


Inac typujem ze to potrebujes pre windows tak PCRE najdes tu : http://gnuwin32.sourceforge.net/packages/pcre.htm

Nahlásit jako SPAM
IP: ...–
shutdown -h now
geon0
Grafoman
Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
sn3d0
Věrný člen
21. 8. 2007   #4
-
0
-

Nojo ;) ciste C-cko je taky jazdyk typu UROB-SI-SAM. Na taketo veci mam uz v C++ vytvorenu podobnu class ako pouzivas ty v Python ;)

Nahlásit jako SPAM
IP: ...–
shutdown -h now
olgo0
Věrný člen
21. 8. 2007   #5
-
0
-

To sn3d: ten clanok este nevisiel. pojednavas tam len o tej pcre.h alebo snad aj regex.h kniznici?
btw.: ja by som tu radsej zvolil sekvencny pristup ako RE. proste nacitas riadok najdes to slovo (v zadani napr neni co mozu byt poprehadzovane) a precitas hodnotu. ale ked parna mlaticka je taka impozantna

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
sn3d0
Věrný člen
21. 8. 2007   #6
-
0
-

To olgo: nejde o impozantnost. Ide o zvyk. Proste som si zvykol na regularne vyrazy. V mnohych pripadoch mi ludia menia specifikacie rovno pod ocami a menia prave taketo blbosti, ako bude ktory string formatovany(neveril by si aky su cinania nejednotny). V tom pripade mi je lebsie pouzit regulane vyrazy a ked dojde k nejakej zmene prepisem len regularny vyaz, nemusim menit celu logiku. Proste moj zvyk a z tohto zvyku vychadzal aj moj prispevok. Ta parna mlaticka mi x-krat usetrila kopu casu. Je vsak pravda ze jemu by stacil aj taky jednoduchy sposob. V clanku pisem o PCRE(tiez zvyk z prace, proste ho tu pouzivame) nakolko sa clanok vola PCRE. :) V ziadnom pripade mi neslo o ukojenie svojho ega a o to ukazat impozantnost parnej mlaticky..

Nahlásit jako SPAM
IP: ...–
shutdown -h now
olgo0
Věrný člen
21. 8. 2007   #7
-
0
-

V ziadnom pripade mi neslo o ukojenie svojho ega a o to ukazat impozantnost parnej mlaticky..


vies dobre ze som to tak nemislel ... narazal som na to prilinkovanie kniznice spustenie par funkcii a hotovo.

V tom pripade mi je lebsie pouzit regulane vyrazy a ked dojde k nejakej zmene prepisem len regularny vyaz, nemusim menit celu logiku.


do istej mieri mas pravdu ale obsiahlejsie (a teda aj konplexnejsie) regularne vyrazi je lepsie raz napisat a zabudnut na ne lebo vrtat sa v nich a skusat nieco upravovat je obcas na slucku.

Ta parna mlaticka mi x-krat usetrila kopu casu


to je hlavni dovod preco som to pisal a ti reagujes prekvapivo presne opacne. ono to moze nejaky ten cas pri programovani usetrit ale ten sa zasa prejavi pri behu aplikacie a ke sa jedna o parsovanie suboru (nikde neni napisane ze nebude mat viac ako 15 riadkov) urcite by som nad niecim uspornejsim pouvazoval

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
sn3d0
Věrný člen
21. 8. 2007   #8
-
0
-

OK v pohode.. Zle som to pochopil. Inac ten performance nieje az tak horuci. V praci mam loadre ktore pumpuju do databaz pre rozne history a metricke tooly kvanta dat z core networku a tie regularne vyrazy to brzdia najmenej. Ked sa jeden vyraz pouziva takto hromadne je dobre naplnit este pcre_extra strukturu pomocou pcre_study() funkcie, to vytvory optimalizaciu reg.vyrazu. Regularne vyrazy sa proste skompiluju, vytvory sa state machine(to sa deje len raz) a ta rychlost je myslim si v pohode.Dalsia vec je uspora casu pri vyvoji. Ako som spominal uz mam pripravenu class-u ktora vlastne zapuzdruje celu pracu s reg.vyrazmy a staci len zavolat 2 funkcie. To mi dost setry cas ako pracne pisat kazdy explode-algoritmus roznych stringov atd. Okrem toho mozem umietnit reg.vyraz do konfguraku danej aplikacie a tak sa stava pruznejsia. Nemusim robit neustaly zasah do kodu a prekompilovavat to.

Samozrejme napisat to nejak rozumne je jasne ze najrychlejsia cesta, ale treba si zvazit ci to stoji za to. Mne sa v 80% ukazalo ze to za to nestoji.Ale to je len moja skusenost. Mozno tvoja je taka ze reg.vyrazy niesu stastne riesenie. Je mnozstvo pohladov na vec a myslim ze jedno jedine najspravnejsie v tomto neexistuje. Toto je vsak na dlhu a celkom zaujimavu debatu a samozrejme zavisi to aj od problemu-od ulohy pred ktoru je clovek postaveny. Ono vsetko je to o tom ze treba si zvazit vsetky klady a zapory a az tak zvolit riesenie.

A co sa tyka sprtania sa v zlozitejsom regularnom vyraze.. tak existuje Visual RegExp.. super tool http://laurent.riesterer.free.fr/regexp/. Ja si ho neviem vynachvalit

Nahlásit jako SPAM
IP: ...–
shutdown -h now
olgo0
Věrný člen
22. 8. 2007   #9
-
0
-

dik za typ na Visual RegExp. osobne pouzivam re iba ked je to nevyhnutne takze ho asi nevyskusam. co sa tyka prenositelnosti a jednorazoveho komilovania re samozrejme suhlasim

Nahlásit jako SPAM
IP: ...–
"Boze, dopraj mi, prosim ta, petdesiat rokov prace a zabavy, a potom nahlu smrt v spanku." J. Grisham
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý