Einzelnen Beitrag anzeigen

Quick_silver

Registriert seit: 2. Jan 2003
78 Beiträge
 
Delphi 6 Enterprise
 
#19

Re: Problem beim Datei auslesen in ein Array

  Alt 21. Sep 2006, 20:22
Array imemr um 1000 statt 1 erhöhen reicht schon.
Aber die TList ist noch besser.
Hat aber eher den Grund das ich damit die Daten dann auch sortieren kann. Die Geschiwindigkeit ist nun angemessen.

Über das Soriteren (wovon ich noch keine Ahnung hab) recherchier ich erstmal im foum. Muss hier ja nicht auch noch breit getreten werden^^

Edit:
Und danke an alle die Geholfen haben.

Hier der Code, vll hilft es ja nochmal:
Delphi-Quellcode:
type
  TDatensatz = record
    ID: integer;
    Text: AnsiString;
  end;

  TDatenPointer = ^TDatensatz;


procedure TForm1.btnReadClick(Sender: TObject);
var
daten1, daten2 : TList;
i : Integer;
p : TDatenPointer;
begin

  daten1 := Tlist.create;
  daten2 := Tlist.create;

  Label1.Caption := 'Lese Datei: '+PathFrom.Text;
  Label1.Update;
  ReadData(PathFrom.Text, daten1);
  Label1.Caption := 'Lese Datei: '+PathTo.Text;
  Label1.Update;
  ReadData(PathTo.Text, daten2);
  //Merge - Muss nurnoch sortiert werden
  Label1.Caption := 'Merge...';
  Label1.Update;
  MergeData( daten1, daten2 );
  //Save - Fehlt noch


  for i := 0 to daten1.count-1 do
  begin
    p := TDatenPointer( daten1.items[ i ] );
    dispose( p );
  end;

  for i := 0 to daten2.count-1 do
  begin
    p := TDatenPointer( daten2.items[ i ] );
    dispose( p );
  end;

  Daten1.Free;
  Daten2.Free;

end;

procedure TForm1.ReadData(datei : string; var daten : TList );
var
fs : TStream;
p : TDatenPointer;

i,j, id, check : Integer;
Len : Short;
text : string;
begin
  fs := TFileStream.Create(datei, fmOpenReadWrite);
  ProgressBar.Max := fs.Size;
  ProgressBar.Position := 0;

  fs.Seek(6,soFromBeginning);
  i := 0;
  j := 1000;

  repeat
    inc(i);

    //Array verlängern
    //if Length( daten ) <= i then
      //SetLength( daten, Length( daten )+3000);


    check := fs.Read(id, SizeOf(id)); //Id auslesen
    if check < SizeOf(id) then //Wenn keinem ehr gab abbrechen
      break;

    fs.Seek(1, soFromCurrent); //1 byte überspringen
    fs.Read(Len, SizeOf(Len)); //Lenge des Strings
    SetLength(text, Len); //Stringlänge setzten
    fs.Read(PChar(text)^, Len); //String auslesen

    //daten[i-1].id := id;
    //daten[i-1].text := text;

    new( p );
    p.ID := id;
    p.Text:= text;
    daten.add( p );

    //Label1.Caption := IntToStr(i);
    //Label1.Update;
    ProgressBar.StepBy(7+Len);

  until check < SizeOf(id);

  fs.Free;
end;


//Veorläufige Verison, kann sicher noch stark optimiert werden:
procedure TForm1.MergeData( Daten1: TList; Daten2: TList);
var
IDsToAdd : array of integer;
i,j:integer;
found : Boolean;
p, p1, p2 : TDatenPointer;
begin
  ProgressBar.Position := 0;
  ProgressBar.Max := Daten2.Count;

  ListBox.Items.Add('Vor Merge Data1.Count: '+ inttostr(daten1.count));
  ListBox.Items.Add('Vor Merge Data2.Count: '+ inttostr(daten2.count));

  for i := 0 to Daten2.Count-1 do
  begin //Data 2 durchgehen
    p2 := TDatenPointer( daten2.items[ i ] );
    ProgressBar.StepBy(1);

    //Suchen ob data2 in data1 vorhanden ist
    found := false;
    for j:=0 to Daten1.Count-1 do
    begin
      p1 := TDatenPointer( daten1.items[ j ] );
      if p1.ID = p2.ID then
      begin
        found := true;
        break;
      end;
    end;

    if found <> true then //Die ID ist in Data1 NICHT vorhanden
    begin
      //Dann muss sie in Data 1 eingefügt werden...
      new( p );
      p.ID := p2.ID;
      p.Text:= p2.Text;
      daten1.add( p );
    end;
  end;

    ListBox.Items.Add('Nach Merge Data1.Count: '+ inttostr(daten1.count));
    ListBox.Items.Add('Nach Merge Data2.Count: '+ inttostr(daten2.count));

    Label1.Caption := 'Merge...Done ... Sort';
    Daten1.Sort(??????????????)


end;
Wem hilft ist gut, wem nicht auch gut und die Sikusion endet dann erstmal hier
  Mit Zitat antworten Zitat