AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Datei auslesen in ein Array

Ein Thema von Quick_silver · begonnen am 21. Sep 2006 · letzter Beitrag vom 21. Sep 2006
Antwort Antwort
Quick_silver

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

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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz