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...
Fórum › C / C++
Extrahovani zvolenych udaju z .txt souboru
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
no fuj, u pythonýrů to máme hezčí ;-) http://programujte.com/forum.php?akce=prispevek&id=5833&sekce=extrahovani-zvolenych-udaju-z--txt-souboru#47310
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
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..
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
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
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
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Extrahovani zvolenych udaju z .txt souboru — založil JohnyD
Upload souboru na FTP server bez přihlašovacích údajů. — založil Nechda
Zapisování od txt souboru — založil M4rty32
Zápis do .txt souboru — založil Pavel
Export do txt souboru — založil matouch
Moderátoři diskuze