Forum > Generale

Filestream per leggere un file

(1/11) > >>

frandell:
Salve a tutti,

Sto cercando di realizzare una specie di parser in grado di leggere un file di testo una riga per volta e confrontarlo con il contenuto di un altro file di testo contenente alcune regole. Quando viene trovato il match della riga con una regola viene scritto su un file xml.
Per file piccoli funziona ed è anche abbastanza veloce. La parte di codice che fa il lavoro da me descritto è la seguente:

--- Codice: ---
procedure TGUI_Parser.ManeggiaLog(const txt: String);
var myFile : TextFile;
myStringa, myOre, myMinuti, mySecondi, mySubStr: Ansistring;
m: integer;
FlagCapt, FlagNew, FlagReal, FlagAlr: boolean;
begin
  AssignFile(myFile,txt);
  Reset(myFile);
  Visualizzatore.Append('Leggo Log File: '+txt);
  StringaCapt_o :='';
  StringaId_o :='';
  RealTime_o := '';
  CpuTime_o := '';
  FlagCapt := False;
  FlagNew := False;
  FlagReal := False;
  SetLength(StringaVett,3500000);
  k:=0;
  while not Eof(myFile) do
  begin
    FlagCapt := False;
    FlagAlr := False;
    StringaCapt_o:=MyDeclare.StringaCapt;
    StringaId_o:=MyDeclare.StringaId;
    RealTime_o:=MyDeclare.RealTime;
    CpuTime_o:=MyDeclare.CpuTime;
    ReadLn(myFile,myStringa);
    ...
  end;
--- Termina codice ---

Purtroppo mi può capitare di maneggiare file di qualche centinaio di MB e in questo caso sto cercando di utilizzare il Filestream per fare lo stesso lavoro ma sembra che per come l'ho implementato io (codice di seguito) non riesca a leggere le righe allo stesso modo.


--- Codice: ---
procedure TGUI_Parser.ManeggiaLog(const txt: String);
var //myFile : TextFile;
Reader : TFileStream;
myStringa, myOre, myMinuti, mySecondi, mySubStr: Ansistring;
m,index,bufferleng: integer;
FlagCapt, FlagNew, FlagReal, FlagAlr: boolean;
begin
  //AssignFile(myFile,txt);
//  Reset(myFile);
  Visualizzatore.Append('Leggo Log File: '+txt);
  StringaCapt_o :='';
  StringaId_o :='';
  RealTime_o := '';
  CpuTime_o := '';
  FlagCapt := False;
  FlagNew := False;
  FlagReal := False;
  bufferleng := 32768;
  k:=0;
  SetLength(StringaVett,3500000);
//  while not Eof(myFile) do
  try
    Reader := TFileStream.Create(txt,fmOpenRead);
    FlagCapt := False;
    FlagAlr := False;
    StringaCapt_o:=MyDeclare.StringaCapt;
    StringaId_o:=MyDeclare.StringaId;
    RealTime_o:=MyDeclare.RealTime;
    CpuTime_o:=MyDeclare.CpuTime;
    Index := 0;
    MyStringa := '';
    Reader.Seek(Index,soFromBeginning);
    SetLength(MyStringa,bufferleng);
    Reader.Read(MyStringa,Index);                       
    ...
    Index := Index + bufferleng;
  finally
    Reader.Free;
  end;       
   
--- Termina codice ---

Non riesco a capire cosa ci sia che non vada bene. Potete aiutarmi per favore?

Grazie mille.

Francesco

Stilgar:

--- Codice: ---
Reader.Read(MyStringa,Index);                     

--- Termina codice ---
Prova

--- Codice: ---
Reader.Read(MyStringa[1],Index);                     

--- Termina codice ---
Dimmi se funziona ;)

frandell:
Ciao Stilgar e grazie per la gentile risposta ma purtroppo il risultato non cambia  :(

Stilgar:
Allora mi sfugge il problema ...
Leggi la stringa sempre alla stessa posizione....

--- Codice: ---
    SetLength(MyStringa,bufferleng);
    Reader.Read(MyStringa,Index);     

--- Termina codice ---

A occhio e crocie quello che leggi è una parte del file.
Se leggi 3 volte, leggi nella posizinoe 3 blocchi del file.
Quindi :
1) Leggi tutto lo stream in un colpo solo.
2) Sposti l'indice di scrittura della stringa.

Ma forse non ho capito il problema e sto andando a margherite...
Stilgar

frandell:
Penso di star leggendo il file a 32768 byte per volta, avendo fissato bufferleng a tale valore e incrementando la Index ogni volta.

Adesso ho spostato fuori dal blocco try l'assegnazione "Index := 0" ma il risultato è lo stesso.

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa