Newsgroup: it.comp.lang.delphi
Titolo: trovare una stringa in un file..

Ciao a tutti,
Mi "servirebbero" i sorgenti di un'applicazione che:
Mi restituisce il contenuto di tutti i link contenuti negli <a href="<Questo
mi server>"> </a> in oltre 20000 file.
Scusate ma è veramente urgente e non ho tempo per svilupparla (adesso mi
metto sotto, prima che mi mettano sotto)... se qualcuno a qualche link lo
ringrazierò a vita..
Ciao a tutti

> Scusate ma è veramente urgente e non ho tempo per svilupparla
io la farei in meno di 10 minuti (dal punto di vista tecnico e' talmente
elementare che mi chiedo come mai ci chieda aiuto), ma non ho neanche io il
tempo, mi spiace :)
Ciao, Sandro

> io la farei in meno di 10 minuti (dal punto di vista >tecnico e'
talmente....
Io ho fatto tutto l'applicazione (basata sulla ricerca) e non ci ho messo 10
min CMQ se tu ce la fai beato te ;)
Ti ricordo che devo passare 30.000 file e non posso leggere linea per
linea...
Posto la funzione che è ottima per la ricerca di stringhe:
function PosInFile(Str,FileName:string):integer;
 var
   Buffer:array[0..1023]of char;
   BufPtr,BufEnd:integer;
   F:File;
   Index:integer;
   Increment:integer;
   c:char;
 function NextChar:char;
 begin
   if BufPtr>=BufEnd then
   begin
     BlockRead(F,Buffer,1024,BufEnd);
     BufPtr := 0;
     Form1.ProgressBar1.Position := FilePos(F);
     Application.ProcessMessages;
   end;
   Result := Buffer[BufPtr];
   Inc(BufPtr);
 end;
 begin
   Result := -1;
   AssignFile(F,FileName);
   Reset(F,1);
   Form1.ProgressBar1.Max := FileSize(F);
   BufPtr:=0;
   BufEnd:=0;
   Index := 0;
   Increment := 1;
   repeat
     c:=NextChar;
     if c=Str[Increment] then
       Inc(Increment)
     else
     begin
       Inc(Index,Increment);
       Increment := 1;
     end;
     if Increment=(Length(Str)+1) then
     begin
       Result := Index;
       Break;
     end;
   until BufEnd = 0;
   CloseFile(F);
   Form1.ProgressBar1.Position := 0;
 end;
Ciao a tutti

 linea...
si, ma con un approccio che sfrutti le caratteristiche di Delphi e' un gioco
da ragazzi, caricando ad esempio i file, uno per uno, in una tstringlist,
quindi facendo una ricerca (in ram) scorrendo le varie stringhe che
compongonono la lista, magari aiutandoti, per velocizzare la cosa con una
unit come FastStrings (ha una funzione "pos" circa 20-40 volte piu' veloce
di quella di Delphi), e caricando in un'altra tstringlist i risultati della
ricerca.
Qualcosa del genere (non lo ho provato, prendilo solo come indicazione):
procedure ricerca(var risultati:tstringlist);
var sr:tsearchrec;
 procedure cercastringhe;
 var temp:tstringlist; i,p:integer; s:string;
 begin
  temp.lines.loadfromfile(
sr.name
);
  for i:=0 to temp.lines.count-1 do begin
   p:=pos('<a href=',temp.lines[i]);
   if p<>0 then begin
    s:=copy(temp.lines[i],p,200);
    risultati.lines.add(copy(s,1,pos('"',s)-1)); // ricava solo la parte di
stringa utile e la aggiunge
   end;
  end;
 end;
begin
 risultati.lines.clear;
 if findfirst('*.htm',faAnyFile,sr)=0 then repeat
  cercastringhe; // questo carica in memoria il file e ne fa la scansione
alla ricerca delle stringhe
 until findnext(sr)<>0;
end;
Ciao, Sandro

Grazie Sandro,
Ma il problema č che potrei avere :
<a
href="">Links</a>
Cmq grazie della risposta
Ciao

 href="">Links</a>
dai, si tratta di raffinare il parser (l'analizzatore della stringa)
considerando i casi particolari. Probabilmente ci vuole piu' tempo a
chiacchierarne qua che non a scrivere il codice ;)
Ciao, Sandro


Anzitutto puoi sgrossare facendo fare parte del lavoro a grep o simili
(gli fai cercare ad esempio </a>)
Inoltre, non conosco le regex, ma credo tu possa specificare una regola
come
\<\a[whitesp]\h\r\e\f\=\"[anychar - \"]\"\>[anychar]\<\/\a\>
dove: \ significa che il carattere che segue va inteso come letterale
[] indica uno o piu' occorrenze di quanto specificato all'interno
whitesp sono i caratteri di spaziatura
anychar e' qualunque carattere
- esclude un carattere dall'insieme a sx del segno
vedi anche il thread "ricercare testo in un file" su it.comp.lang.python
Saluti
Paolo Arosio

vedi anche il thread "ricercare testo in un file" su it.comp.lang.python
A questo aggiungerei anche di dare un occhio a it.comp.www.php, le espressioni
regolari sono il pane quotidiano del ng. :)
-- 
Morde. 
morde[at]programmer[.]net

 Posto la funzione che è ottima per la ricerca di stringhe:
[CUT]
Se vuoi guadagnare in velocità cerca gli algoritmi boyer-moore, sono
estremamente ottimizzati per la ricerca di pattern dentro ad un buffer.
Ciao
Matteo

Esiste la funziona AnsiPos che restituisce un intero che indica la posizione
della stringa cercata all'interno di un'altra
--
Max Etere
massimili...@programmando.org
http://www.programmando.org