Einzelnen Beitrag anzeigen

OG Karotte
(Gast)

n/a Beiträge
 
#10

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 13:10
Ok, im Anhang ein ausführlicheres Beispiel der Datensätze (Daten sind angepasst, Originaldaten kann ich leider nicht veröffentlichen).

Zu Testzwecken (ich hatte in etwa an den von HalloDu beschriebenen Ansatz gedacht, also erstmal Feldnamen holen und dann Daten zuordnen) habe ich TATStreamSearch verwendet, nur um mal einen Eindruck zubekommen wie lange das dauern könnte. Ausserdem wollte ich den jeweils kompletten Feldnamen haben und die Möglichkeit eine RegEx-Suche durchzuführen erschien mir aufgrund der gegebenen unterschiedlichen Feldnamen angebracht.

Hier der verwendete erste Versuch (angepasst aus dem o.g. TATStreamSearch-Demo):
Delphi-Quellcode:
function TfrmMain.Find(AFindFirst: Boolean):Boolean;
var
  OK: Boolean;
begin

  Result := False;

  OK := False;

  try
    if AFindFirst then
    begin
      try
        strsrch_Main.FileName := FFileName;
      except
        Application.MessageBox('Cannot open filename specified', 'Error', MB_OK or MB_ICONERROR);
        Exit;
      end;
      OK := strsrch_Main.FindFirst('(\w*): ', 0, FEncoding, FOptions);
    end
    else
    begin
      OK := strsrch_Main.FindNext;
    end;

  except
    on E: Exception do
      if E.Message <> 'then
      begin
        Application.MessageBox(PChar(E.Message), 'Search failed', MB_OK or MB_ICONERROR);
        Exit;
      end;
  end;

  if OK then
    begin
      bh_Main.SetSelection(strsrch_Main.FoundStart, strsrch_Main.FoundLength, True);
      Inc(FRecordCount);

      memUC_Main.Lines.Add(bh_Main.SelText);

      edOffset.Text := IntToStr(strsrch_Main.FoundStart);
      edCount.Text := IntToStr(FRecordCount);
      pb1.Position := strsrch_Main.FoundStart * 100 div FFileSize;
    end
  else
    Application.MessageBox('Search string not found', 'Search failed', MB_OK or MB_ICONERROR);
//
  Application.ProcessMessages;
  result := OK;
end;
Der Aufruf erfolgt durch:

Delphi-Quellcode:
procedure TfrmMain.btnUC_GetKeysClick(Sender: TObject);
var
  OK:Boolean;

begin
  FAbort := False;
  FEncoding := vencANSI;
  FOptions := [];
  FRecordCount := 0;
  Include(FOptions, asoRegEx);
  if Find(True) then
  repeat
    OK := Find(False);
  until (not OK) or FAbort;
  FAbort := False;
end;
Wie gesagt, das war erst einmal nur ein Test um ein Gefühl für die Zeit zu bekommen, die das Auslesen benötigen könnte.
Angehängte Dateien
Dateityp: txt bspds_178.txt (3,0 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat