Pagina 1 di 1
[C] File parsing [risolto]
Inviato: lun 5 mag 2008, 0:06
da Dani
Esiste una funzione per cercare determinate parole in un file, vedere se sono presenti e ottenere quindi l'offset delle stesse all'interno dello stream ?
In pratica mi servirebbe una strstr() che anzichè parsare stringhe parsi il contenuto di un testo, e che anzichè ritornare un puntatore ritorni un offset.
L'ideale sarebbe poter usare le regex su file
Esiste qualcosa del genere o bisogna procedere "a mano" :P ?
Re: [C] File parsing
Inviato: lun 5 mag 2008, 13:26
da absinthe
non credo esista... comunque potresti caricare tutto il file di testo in un buffer ed usare strstr lì!
M
Re: [C] File parsing
Inviato: lun 5 mag 2008, 13:56
da Mario Vanoni
Non reinventare la ruota!
egrep -b parola file
Il codice sorgente e` GPL.
Mario Vanoni
Re: [C] File parsing
Inviato: mar 6 mag 2008, 1:58
da Dani
@Absinthe: non posso, il file è troppo grande !
@Mario: dici di prendere parte del sorgente di grep ?
A proposito di grep è davvero sorprendente, parsa un file da decine di mega in appena poco piu' di un decimo di secondo. Ma come fa !
Re: [C] File parsing
Inviato: mar 6 mag 2008, 10:16
da gioco
Dai un'occhiata alla libreria pcre (presente in Slackware). La usai anni fa per un progetto, implementa le espressioni regolari in C. Ora non ricordo bene l'API, ma forse trovi qualcosa di utile (magari non esattamente quello che ti serve, ma con le regex a disposizione puoi scrivere da te la funzione di cui hai bisogno). Facci sapere, può essere utile anche per altri.
Re: [C] File parsing
Inviato: mar 6 mag 2008, 15:11
da Mario Vanoni
Dani ha scritto:
@Mario: dici di prendere parte del sorgente di grep ?
A proposito di grep è davvero sorprendente, parsa un file da decine di mega in appena poco piu' di un decimo di secondo. Ma come fa !
ATTENTO: parlo di egrep!
Mario Vanoni
Re: [C] File parsing
Inviato: mer 7 mag 2008, 4:55
da Dani
Sono riuscito a scrivere del brevissimo e banalissimo codice che fa al caso mio; praticamente visto che il file è troppo grande e caricandolo in ram occuperebbe troppa memoria, basta leggere riga per riga e cercare qui la parola !
Sottovalutavo fgets(), ho ottenuto il risultato sperato utilizzando sorprendentemente poche risorse.
Codice: Seleziona tutto
dani[~]$ time grep -b libQtGui.so.4.3.4 MANIFEST.TXT
11361421:-rw-r--r-- root/root 8032 2008-02-26 22:28 opt/qt4/lib/libQtGui.so.4.3.4.debug
11362492:-rwxr-xr-x root/root 7047944 2008-02-26 22:28 opt/qt4/lib/libQtGui.so.4.3.4
real 0m0.062s
user 0m0.029s
sys 0m0.021s
dani[~]$ time ./a.out MANIFEST.TXT libQtGui.so.4.3.4
11361421:-rw-r--r-- root/root 8032 2008-02-26 22:28 opt/qt4/lib/libQtGui.so.4.3.4.debug
11362492:-rwxr-xr-x root/root 7047944 2008-02-26 22:28 opt/qt4/lib/libQtGui.so.4.3.4
real 0m0.243s
user 0m0.192s
sys 0m0.024s
dani[~]$
...molto piu' lento ma comunque sopra le mie aspettative.
@gioco: le pcre sembrano interessanti, ma che tu sappia agiscono anche su file ?
@Mario: grep ed egrep mi sembra siano la stessa cosa.
Re: [C] File parsing
Inviato: mer 7 mag 2008, 10:58
da gioco
Dani ha scritto:@gioco: le pcre sembrano interessanti, ma che tu sappia agiscono anche su file ?
Ho dato una rapida occhiata alle API (ricordavo poco), ma non mi sembra che lo facciano.
Nel tuo caso mi pare che le necessità fossero due: leggere efficientemente un file di grandi dimensioni e cercare un pattern in un file. Le pcre risolvono il secondo, per il primo, oltre alla soluzione da te usata, può essere utile mmap (man 2 mmap). Una volta che hai un metodo efficiente per leggere un file puoi usare le funzioni di pcre sulle stringhe.
man 1 grep ha scritto:Egrep is the same as grep -E.
man 1 grep ha scritto:-E, --extended-regexp
Interpret PATTERN as an extended regular expression (see below).
Re: [C] File parsing [risolto]
Inviato: gio 8 mag 2008, 4:34
da Dani
Peccato, mi sarebbero state utili altrimenti.
Per le regex su stringhe in genere uso le funzioni delle glibc, quindi se sono costretto a leggere riga per riga una volta che ho i dati in un buffer vanno bene queste.
Ok, risolto, grazie a tutti.