Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigenes Dateiformat (https://www.delphipraxis.net/155442-eigenes-dateiformat.html)

Coder 23. Okt 2010 19:13

Delphi-Version: 5

Eigenes Dateiformat
 
Hallo,


und zwar möchte ich mein von mir selbst entwickeltes Dateiformat
(jaaa, lobt mich ! :D) wieder auslesen.

Ich hab nämlich nicht bedacht, wie man da vorgehen könnte.
Dämlicherweise hab ich schon einige tausend Einträge derart gespeichert.

Und zwar handelt es sich dabei um etwa folgende Struktur:

Code:
<Name>
Karl Heinz
<Adresse>
 Im weiten Feld 23
 Zimmer 3
 79856 Fritzlar
<Telefon>
07985/ 865656
<Geb.datum>
14.07.1978
<Name>
also ich brauche eigentlich kein richtiges XML, da ich keine direkten Childs habe (so, wie ich das seh), dacht ich... zudem wollte ich Speicherplatz sparen.
Und da das alles nur so hintereinander eingelesen werden muß...
Einzig ist natürlich nur, daß ich einige Teile der Datensätze hab, die über mehrere Zeilen gehen können - so wie die Adresse.
und da ist der Knackpunkt. ..
wie weit les ich ein, bis ich auf den nächsten Tag stoße?
Oder wie handelt man eine solche [schon vorhandene Struktur ...eeeek, s.o.]
und liest die am besten wieder aus?

Luckie 23. Okt 2010 19:24

AW: Eigenes Dateiformat
 
Mach es entweder richtig mit XML oder nimm typisierte Dateien, wobei ich XML-Dateien vor ziehen würde.

Sir Rufo 23. Okt 2010 19:27

AW: Eigenes Dateiformat
 
Also entweder ein wildes Konstrukt bauen, was den ganzen Sermon wieder auseinanderfudelt

Oder die Daten in einem Record speichern und den Record in die Datei schreiben.
Das Auslesen geht dann so einfach wie das Schreiben und ist mit ein paar Zeilen Code erledigt.

Du hast die Wahl

vergessen 23. Okt 2010 21:36

AW: Eigenes Dateiformat
 
Brenn' Deine selbstvermurxte "Datenbank" sofort auf eine CD/DVD, bevor Du noch (viel) mehr Schaden in der "Datenbank" anrichtest! :oops:

Satty67 23. Okt 2010 21:41

AW: Eigenes Dateiformat
 
Selbst wenn er zukünftig ein anderes Datenformat verwendet, muss er ja die Daten wieder Einlesen um die zu konvertieren. Zumindest wenn es sich um einige tausend Einträge handelt, wie er geschrieben hat.

Ganz so schlimm ist das Einlesen aber nicht, einfach bei Auftreten eines <Tag> entsprechend reagieren. Also neuen Datensatz schalten bei <Name> und Datenfeld bei den anderen Tags.

Luckie 23. Okt 2010 21:42

AW: Eigenes Dateiformat
 
Was für eine Datenbank? Das ist strukturierter Datenmüll. :mrgreen:

Assarbad 23. Okt 2010 21:48

AW: Eigenes Dateiformat
 
Man nehme Perl oder eine andere beliebige Skriptsprache und konvertiere in ein Format welches mit Delphi leichter zu verarbeiten ist ;)

Alternativ kann man auch einen mit flex selbstgeschriebenen Scanner benutzen.

Ach ja, als Antwort auf Luckies Hinweis XML zu benutzen, möchte ich ein rotzfreches: "Benutz SQLite" einwerfen :mrgreen:

implementation 23. Okt 2010 21:59

AW: Eigenes Dateiformat
 
Leutchens? Für sowas ist Automatentheorie gut :stupid:
Man nehme einen Bei Google suchendeterministischen endlichen Automaten (DEA) und schon geht das ganze ganz einfach.

In etwa so:
Delphi-Quellcode:
type
  TReader = class
  private
    IsTag: Boolean;
    Values: TDictionary<string, string>;
    Current, Tag: string;
  public
    procedure Feed(c: Char);
    procedure Push;
  end;

procedure TReader.Push;
begin
  if IsTag then begin
    Tag := Current;
    Current := '';
  end else begin
    Values[Tag] := Current;
    Current := '';
  end;
end;

procedure TReader.Feed(c: Char);
begin
  if c = '<' then begin
    Push;
    IsTag := true;
  end else if c = '>' then begin
    Push;
    IsTag := false;
  end else Current := Current + c;
end;

...

for i := 1 to Length(dateialsstring) do
  Reader.feed(dateialsstring[i]);
Keine Garantie auf Richtigkeit, nur schnell zusammengetippt.

Luckie 23. Okt 2010 22:02

AW: Eigenes Dateiformat
 
Man beachte die Delphi Version: D3 Prof.

implementation 23. Okt 2010 22:04

AW: Eigenes Dateiformat
 
Zitat:

Zitat von Luckie (Beitrag 1057425)
Man beachte die Delphi Version: D3 Prof.

Demnach geht dann halt kein generisches Dictionary. Aber bei dem Beispiel ging es eher um das Prinzip des Automaten.

[ot]Mit Generics in Delphi habe ich sowieso noch nie gearbeitet. Bin zum FPC und dann zu C# gewechselt, bevor die kamen. Und beim FPC ham die 'ne andere Syntax. :stupid:[/ot]

Assarbad 23. Okt 2010 22:06

AW: Eigenes Dateiformat
 
Zitat:

Zitat von Luckie (Beitrag 1057425)
Man beachte die Delphi Version: D3 Prof.

5, lt. Beitrag. Wobei das an der Kritik nichts ändert. Wie ich das so sehe sind Generics dabei ...

Luckie 23. Okt 2010 22:15

AW: Eigenes Dateiformat
 
Laut Profil 3. Aber das ändert nichts.

Bummi 23. Okt 2010 22:24

AW: Eigenes Dateiformat
 
oder Quick and Dirty

Delphi-Quellcode:
type
  TAdresse=Record
    Name:String;
    Adresse:String;
    Telefon:String;
    Geboren:String;
  End;
TAdressArray=Array of TAdresse;

var
  Form1: TForm1;
  AdressArray:TAdressArray;

implementation

{$R *.dfm}
Procedure ReadToArray(fn:String);
type
  rStatus=(Name,Adresse,Telefon,Geboren);
var
  sl:TStringList;
  i:Integer;
  lStatus:rStatus;
  Procedure AppendTo(Var s:String);
    var
      nz:String;
    begin
      if Length(s)>0 then nz := #13#10 else nz := '';
      s := s + nz+ sl[i];

    end;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(fn);
    for I := 0 to sl.Count - 1 do
       begin
         if Trim(sl[i])='<Name>' then
            begin
               lStatus:=Name;
               SetLength(AdressArray,High(AdressArray) + 2);
            end
         else if Trim(sl[i])='<Adresse>' then
            begin
               lStatus:=Adresse;
            end
         else if Trim(sl[i])='<Telefon>' then
            begin
               lStatus:=Telefon;
            end
         else if Trim(sl[i])='<Geb.datum>' then
            begin
               lStatus:=Geboren;
            end
         else
            begin
              case Lstatus of
                Name:   AppendTo( AdressArray[High(AdressArray)].Name);
                Adresse: AppendTo( AdressArray[High(AdressArray)].Adresse);
                Telefon: AppendTo( AdressArray[High(AdressArray)].Telefon);
                Geboren: AppendTo( AdressArray[High(AdressArray)].Geboren);
              end;
            end;

       end;
  finally
    sl.Free;
  end;
end;

himitsu 23. Okt 2010 22:27

AW: Eigenes Dateiformat
 
< durch [ und > durch ] ersetzt und schon hat man eine "leicht" vermurkste INI, welche man z.B. mit Hier im Forum suchenFastIniFiles auslesen könnte. :angle2:

Sir Rufo 23. Okt 2010 22:34

AW: Eigenes Dateiformat
 
oder so
Code:

"Name":"Karl Heinz",
"Adresse": "Im weiten Feld 23/n/rZimmer 3/n/r79856 Fritzlar"
"Telefon":"07985/ 865656",
"Geb.datum":"14.07.1978"
}
als JSON

implementation 23. Okt 2010 22:40

AW: Eigenes Dateiformat
 
Zitat:

Zitat von Assarbad (Beitrag 1057427)
Zitat:

Zitat von Luckie (Beitrag 1057425)
Man beachte die Delphi Version: D3 Prof.

5, lt. Beitrag. Wobei das an der Kritik nichts ändert. Wie ich das so sehe sind Generics dabei ...

Zitat:

Zitat von Luckie (Beitrag 1057431)
Laut Profil 3. Aber das ändert nichts.

Siehe mein Folgebeitrag. Das generische Dictionary war nur als Quick&Dirty-Beispiel, es ging vielmehr um den DEA.
Zitat:

Zitat von Bummi (Beitrag 1057437)
oder Quick and Dirty
Delphi-Quellcode:
...

Also ich halte den DEA für flexibler, falls das Format noch weiter ausgebaut werden soll. :gruebel:
Zitat:

Zitat von himitsu (Beitrag 1057438)
< durch [ und > durch ] ersetzt und schon hat man eine "leicht" vermurkste INI, welche man z.B. mit Hier im Forum suchenFastIniFiles auslesen könnte. :angle2:

Die wäre aber sehr vermurkst.
Zitat:

Zitat von Sir Rufo (Beitrag 1057443)
oder so
Code:

"Name":"Karl Heinz",
"Adresse": "Im weiten Feld 23/n/rZimmer 3/n/r79856 Fritzlar"
"Telefon":"07985/ 865656",
"Geb.datum":"14.07.1978"
}
als JSON

Er ist ja nicht auf der Suche nach neuen Möglichkeiten, die Daten zu speichern, sondern möchte Dateien in seinem bisherigen Format auslesen.

Bummi 23. Okt 2010 22:47

AW: Eigenes Dateiformat
 
Zitat:

Zitat von Bummi:
oder Quick and Dirty
...
Also ich halte den DEA für flexibler, falls das Format noch weiter ausgebaut werden soll.
Ich gehe davon aus, daß er selbst gesehen hat, daß er sich verrannt hat und nur seine Daten retten will....

implementation 23. Okt 2010 22:49

AW: Eigenes Dateiformat
 
Zitat:

Zitat von Bummi (Beitrag 1057448)
Ich gehe davon aus, daß er selbst gesehen hat, daß er sich verrannt hat und nur seine Daten retten will....

Ich geb' dir ja Recht :lol:

himitsu 23. Okt 2010 22:55

AW: Eigenes Dateiformat
 
Soooo schlimm ist es ja garnicht.

Im Grunde ist es ja eigentlich nur
- 'ne abgespeckte INI, mit leichter XML-Ähnlichkeit, ohne Value-Names und mit mehrfachen Sections
- eine kleinere XML-änhnliche lineare (kein Baum) Struktur ohne schließende Knoten und ohne Root-Knoten

Delphi-Laie 23. Okt 2010 22:58

AW: Eigenes Dateiformat
 
Zitat:

Zitat von Coder (Beitrag 1057388)
wie weit les ich ein, bis ich auf den nächsten Tag stoße?

Bis 24 Uhr.

Zitat:

Zitat von Coder (Beitrag 1057388)
Oder wie handelt man eine solche [schon vorhandene Struktur ...eeeek, s.o.]
und liest die am besten wieder aus?

Um hier substantiell helfen zu können, müßte die Datenstruktur m.E. nicht nur kryptisch angedeutet, sondern vollständig offengelegt werden.

himitsu 23. Okt 2010 23:04

AW: Eigenes Dateiformat
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1057454)
Bis 24 Uhr.

Täg (in englisch), also bis zum nächsten <tag> :wink:

Luckie 23. Okt 2010 23:05

AW: Eigenes Dateiformat
 
Also um das hier mal voran zu treiben. Gib uns mal die Datenstruktur und am besten noch, wie du die Daten schreibst.

Delphi-Laie 23. Okt 2010 23:09

AW: Eigenes Dateiformat
 
Zitat:

Zitat von himitsu (Beitrag 1057456)
Zitat:

Zitat von Delphi-Laie (Beitrag 1057454)
Bis 24 Uhr.

Täg (in englisch), also bis zum nächsten <tag> :wink:

himitsu, das wußte ich durchaus, aber das war solch eine schöne Steilvorlage für ein Wortspielchen, ein absichtliches Mißverstehen.... Moderator Luckie, sieh mir bitte diesen meinen Beitrag, der nicht inhaltliches beiträgt, nach.

Sir Rufo 23. Okt 2010 23:09

AW: Eigenes Dateiformat
 
Zitat:

Zitat von implementation;
Zitat:

Zitat von Sir Rufo;
oder so
Code:

"Name":"Karl Heinz",
"Adresse": "Im weiten Feld 23/n/rZimmer 3/n/r79856 Fritzlar"
"Telefon":"",
"Geb.datum":"14.07.1978"
}
als JSON

Er ist ja nicht auf der Suche nach neuen Möglichkeiten, die Daten zu speichern, sondern möchte Dateien in seinem bisherigen Format auslesen.

Und wir versuchen ihm gerade zu erklären, dass es besser ist die Daten in einer anderen Form zu speichern und die bisher vorhandenen entsprechend zu konvertieren (einmalig)

Allerdings ist man auch von einer gewissen Blindheit geschlagen Daten in irgendeiner Art zu speichern und sich dann urplötzlich die Frage stellt, wie kann ich die denn wieder Auslesen.

Meine Empfehlung ist immer einen bestimmten Standard zu benutzen (textbasierend z.B. ini, xml, json)
Dafür gibt es fertige Routinen und die Implementierung ist meistens nur ein paar Zeilen Code entfernt.

implementation 23. Okt 2010 23:11

AW: Eigenes Dateiformat
 
Zitat:

Zitat von Luckie (Beitrag 1057457)
Gib uns mal die Datenstruktur.

Die geht doch aus dem Beispiel hervor :gruebel:

Datei = (Datensatz)*
Datensatz = (Tag) CRLF (Wert) CRLF
Tag = "<" (Name) ">"

Sir Rufo 23. Okt 2010 23:13

AW: Eigenes Dateiformat
 
Zitat:

Zitat von implementation;
Zitat:

Zitat von Luckie;
Gib uns mal die Datenstruktur.

Die geht doch aus dem Beispiel hervor :gruebel:

Datei = (Datensatz)*
Datensatz = (Tag) CRLF (Wert) CRLF
Tag = "<" (Name) ">"

Zum Verständnis ein kleiner Witz:
"Liebling, was war es bevor du es gekocht hast?"

Mein Tip:

Die Daten kommen direkt von der Form (Edit1.Text)

Garfield 24. Okt 2010 00:03

AW: Eigenes Dateiformat
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1057454)
Zitat:

Zitat von Coder (Beitrag 1057388)
wie weit les ich ein, bis ich auf den nächsten Tag stoße?

Bis 24 Uhr.

Bei uns im Betrieb geht es bis 30 Uhr.

implementation 24. Okt 2010 00:04

AW: Eigenes Dateiformat
 
Darf ich mir mal eure Uhr ausleihen? :mrgreen:

Garfield 24. Okt 2010 10:51

AW: Eigenes Dateiformat
 
Du musst allerdings auch wissen, dass die Uhr bei 30:00:00 sofort auf 06:00:00 springt. Ist so, weil die Nachtschicht um 22:00 bzw. 18:00 beginnt und bis 06:00 (-> 30:00) geht.

Nachtrag:

Es wird auch mit 1 Stunde = 100 Industrieminuten gerechnet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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 by Thomas Breitkreuz