![]() |
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:
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.
<Name>
Karl Heinz <Adresse> Im weiten Feld 23 Zimmer 3 79856 Fritzlar <Telefon> 07985/ 865656 <Geb.datum> 14.07.1978 <Name> 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? |
AW: Eigenes Dateiformat
Mach es entweder richtig mit XML oder nimm typisierte Dateien, wobei ich XML-Dateien vor ziehen würde.
|
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 |
AW: Eigenes Dateiformat
Brenn' Deine selbstvermurxte "Datenbank" sofort auf eine CD/DVD, bevor Du noch (viel) mehr Schaden in der "Datenbank" anrichtest! :oops:
|
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. |
AW: Eigenes Dateiformat
Was für eine Datenbank? Das ist strukturierter Datenmüll. :mrgreen:
|
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 ![]() Ach ja, als Antwort auf Luckies Hinweis XML zu benutzen, möchte ich ein rotzfreches: "Benutz SQLite" einwerfen :mrgreen: |
AW: Eigenes Dateiformat
Leutchens? Für sowas ist Automatentheorie gut :stupid:
Man nehme einen ![]() In etwa so:
Delphi-Quellcode:
Keine Garantie auf Richtigkeit, nur schnell zusammengetippt.
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]); |
AW: Eigenes Dateiformat
Man beachte die Delphi Version: D3 Prof.
|
AW: Eigenes Dateiformat
Zitat:
[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] |
AW: Eigenes Dateiformat
Zitat:
|
AW: Eigenes Dateiformat
Laut Profil 3. Aber das ändert nichts.
|
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; |
AW: Eigenes Dateiformat
< durch [ und > durch ] ersetzt und schon hat man eine "leicht" vermurkste INI, welche man z.B. mit
![]() |
AW: Eigenes Dateiformat
oder so
Code:
als JSON
{
"Name":"Karl Heinz", "Adresse": "Im weiten Feld 23/n/rZimmer 3/n/r79856 Fritzlar" "Telefon":"07985/ 865656", "Geb.datum":"14.07.1978" } |
AW: Eigenes Dateiformat
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Eigenes Dateiformat
Zitat:
|
AW: Eigenes Dateiformat
Zitat:
|
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 |
AW: Eigenes Dateiformat
Zitat:
Zitat:
|
AW: Eigenes Dateiformat
Zitat:
|
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.
|
AW: Eigenes Dateiformat
Zitat:
|
AW: Eigenes Dateiformat
Zitat:
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. |
AW: Eigenes Dateiformat
Zitat:
Datei = (Datensatz)* Datensatz = (Tag) CRLF (Wert) CRLF Tag = "<" (Name) ">" |
AW: Eigenes Dateiformat
Zitat:
"Liebling, was war es bevor du es gekocht hast?" Mein Tip: Die Daten kommen direkt von der Form (Edit1.Text) |
AW: Eigenes Dateiformat
Zitat:
|
AW: Eigenes Dateiformat
Darf ich mir mal eure Uhr ausleihen? :mrgreen:
|
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