AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Textdatei > 500 MB für DB vorbereiten

Ein Thema von OG Karotte · begonnen am 3. Jan 2008 · letzter Beitrag vom 4. Jan 2008
Antwort Antwort
Seite 1 von 3  1 23   
OG Karotte
(Gast)

n/a Beiträge
 
#1

Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 00:13
Hallo zusammen,

ich habe hier eine Textdatei die ca. 180.000 Datensätze enthält. Diese Datensätze müssen nun in eine Access.db überführt werden. Die Ausgangsdatei ist folgendermaßen aufgebaut:

Code:
Feldname 1: Feldinhalt
Feldname 2: Feldinhalt
Feldname 3: Feldinhalt
Feldname 4: Feldinhalt
Feldname 5: Feldinhalt
Feldname 6: Feldinhalt
...
Feldname n: Feldinhalt

Datensatztrenner (0x0c)

Feldname 1: Feldinhalt
Feldname 3: Feldinhalt
Feldname 4: Feldinhalt
Feldname 6: Feldinhalt
...
Feldname n: Feldinhalt

Datensatztrenner (0x0c)

usw.
Wie man sieht, ist nicht jeder Datensatz identisch aufgebaut, will sagen in einem Datensatz können es 10 Felder sein, in einem anderen 20 (realistische Werte) sein.

Die Access-DB muss aus den Feldern (ALLE möglichen) generiert und anschließend befüllt werden.

Das ganze soll evtl. im Quartalsrythmus aktualisiert werden.

Mein Problem:

Mir fällt im Augenblick nichts effizientes (Speicherbedarf, Geschwindigkeit) ein, um die Datei zu analysieren / vorzubereiten bzw. in Access zu überführen.

Für Denkanstösse wäre ich sehr dankbar.
  Mit Zitat antworten Zitat
HalloDu

Registriert seit: 24. Apr 2006
Ort: Oelde
267 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 00:39
Ist das ein Lotus Textformat?

Ich hab mal für sowas Ähnliches(Lotus Text, oder so) einen Konverter zu CSV geschrieben und es da so gemacht, dass ich erst einen Durchgang gemacht habe um alle Felder zu bestimmen und diese dann in nen Array geschrieben hab. Dann hab ich die Feldnamen schonmal in die CSV geschrieben. Als nächstes bin ich dann das ganze Datensatz für Datensatz durchgangen und ich hab das dann auch wieder in einen zweiten Array geschrieben, der die gleiche Anzahl von Elementen wie der Erste hat und das dann an die gleiche Position, die der entsprechende Feldname im ersten Array hat, geschrieben. Am Datensatz-Ende wurde dieser Array dann in die CSV geschrieben (Du müsstest das natürlich in die Datenbank schreiben).

Hoffe dir hilft das ein bissle, wenns dich interessiert kann ich die Source von dem Programm raussuchen, bin mir aber nicht ganz sicher, ob ich die finde.
Frederic H.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 06:36
Ich würde die Datei per Stream in einen Buffer laden (immer einen Datensatz) und diesen dann zerlegen und in die Datenbank schreiben.
Markus Kinzler
  Mit Zitat antworten Zitat
OG Karotte
(Gast)

n/a Beiträge
 
#4

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 12:34
@HalloDu: Ja, es ist ein LoNo Export und als Lösungsansatz wäre ich schon an Deinem Source intressiert.

@mkinzler: So in etwa habe ich schon angefangen, aber das dauert ziemlich lange.

Trotzdem Dank, denn das zeigt, das ich nicht total auf dem Holzweg war...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#5

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 12:42
was ist denn "ziemlich lange" für eine Zeiteinheit?
(dat ganze sollte in wenigen Minütchen zu bewerkstelligen sein ...
kommt auf die DB an, aber unter 5, wenn nicht gar unter 2 minuten wär schon möglich)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
HalloDu

Registriert seit: 24. Apr 2006
Ort: Oelde
267 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 13:02
Hier sind die Sourcen+compilierte Exe. Sind allerdings nur sporadisch kommentiert und auch überhaupt nicht optimiert (Hab das mal nur so zwischendurch geschrieben). Aber sie funktionieren einwandfrei.
Angehängte Dateien
Dateityp: rar stxt_to_csv_950.rar (208,9 KB, 15x aufgerufen)
Frederic H.
  Mit Zitat antworten Zitat
OG Karotte
(Gast)

n/a Beiträge
 
#7

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 13:12
Zitat von himitsu:
was ist denn "ziemlich lange" für eine Zeiteinheit?
(dat ganze sollte in wenigen Minütchen zu bewerkstelligen sein ...
kommt auf die DB an, aber unter 5, wenn nicht gar unter 1-2 minuten wär schon möglich)
Nun, dann habe ich noch viel vor mir...

Derzeit liege ich beim Suchdurchlauf (Auslesen der Feldnamen) bei deutlich über fünf Minuten und da ist noch keine Zuordnung der Feldinhalte, geschweige denn das schreiben der DB enthalten
Gibst da vielleicht irgendein Trick

@halloDu: Danke, schau ich mir nachher gleich mal an.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 13:15
Ohne die Datei und deinen Code zu kennen, kann man da nicht viel sagen.
Poste doch mal den Code und den Anfang der Datei (ein paar DS)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#9

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 13:36
also das läßt sich leicht ausrechnen ... hier auf dem "altem" Rechner jag ich ich mal so 10 MB/Sekunde durch die Platte und daheim weit über 30)

500MB / 10MB/s = 50s und dazu noch kommt dann noch das rumstöbern in den gelesenen Daten.

Wie mkinzler schon sagte, was hast du denn bis jetzt ... mal sehn was sich optimieren läßt.


OK, maximal Geschwindigkeit muß ja bestimmt nicht unbedingt sein ... würde ja (eventuell sehr viel) mehr Aufwand bedeuten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
OG Karotte
(Gast)

n/a Beiträge
 
#10

Re: Textdatei > 500 MB für DB vorbereiten

  Alt 3. Jan 2008, 14: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
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz