Entwickler-Ecke
Dateizugriff - Wie am besten Daten speichern
pwsolaris - Fr 29.04.11 18:30
Titel: Wie am besten Daten speichern
Hallo,
dieses mal suche ich ein wenig Inspiration bei euch.
Ich suche ein Lösung, Daten die immer in der gleichen Konstellation auftreten, in einer Datei zu sichern.
Die Daten sind wie folgt aufgebaut:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| Person: -Name -Alter -Zeitpunkt -Datum -Gewicht -Größe |
Ich habe dann später vor, anhand der gespeicherten Daten einen Zeitraum zu berechnen, verlorenes oder zugelegtes Gewicht bzw. Größe auszugeben und natürlich zu jedem Datum die einzelnen Werte auszulesen und anzuzeigen.
Die Daten sollen dann auch für jede Person einzeln abgelegt werden.
Ich möchte dazu nicht extra eine Datenbank benutzen, da hier ja keine riesigen Massen an Daten auflaufen werden... jedoch habe ich zur Zeit keine Ahnung, was da so am besten wäre...
Gibt es außer einer INI-Datei noch andere Möglichkeiten, die sich evtl. eher anbieten?
bummi - Fr 29.04.11 18:35
Clientdataset entweder XML oder RAW ....
Bergmann89 - Fr 29.04.11 21:07
Hey,
wenn du die Daten einfach nur auch der Festplatte ablegen willst, dann kannst du das ganze per FileStream auf die HDD schieben.
Vorteile: es geht schnell
Nachteile: man kann die Daten nicht mehr mit einem Editor bearbeiten oder lesen (wie das zB bei XML geht)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67:
| type TData = packed record Datum: TDate; Gewicht, Größe: Single; end; PData = ^TData;
TPerson = class(TObject) private fName: String; fAlter: Integer; fDataList: TList; public procedure SaveToStream(Stream: TStream); procedure LoadFromStream(Stream: TStream); end;
procedure WriteString(const str: String; Stream: TStream); var len: Integer; begin len := Length(str); Stream.Write(len, SizeOf(len)); if Length(str) > 0 then Stream.Write(str[1], len); end;
function ReadString(Stream: TStream): String; var len: Integer; begin len := 0; Stream.Read(len, SizeOf(len)); SetLength(result, len); if Length(result) > 0 then Stream.Read(result[1], len); end;
procedure TPerson.SaveToStream(Stream: TStream); var i: Integer; p: PData; begin WriteString(fName, Stream); Stream.Write(fAlter, SizeOf(fAlter)); i := fDataList.Count; Stream.Write(i, SizeOf(i)); for i := 0 to fDataList.Count-1 do begin p := fDataList[i]; Stream.write(p^, SizeOf(p^)); end; end;
procedure TPerson.LoadFromStream(Stream: TStream); var i, count: Integer; p: PData; begin fName := ReadString(Stream); Stream.Read(fAlter, SizeOf(fAlter); Stream.Read(count, SizeOf(count); for i := 0 to count-1 do begin new(p); Stream.read(p^, SizeOf(p^)); fDataList.add(p); end; end; |
MfG Bergann
COMMANDER86 - Sa 30.04.11 18:40
N'Abend,
in solchen Fällen greife ich immer gerne zur CSV-Datei. Ich weiß, das ist sicherlich nicht die beste Methode...
In diesem Fall würde ich zwei "Tabellen" / CSV-Dateien anlegen:
person.csv
Index;Name;Alter;Zeitpunkt
und ... kA... daten.csv
Personenindex;Datum;Gewicht;Größe
Die beiden lassen sich recht easy verknüpfen. Laden und Entladen würde ich in einer StringList. Ich weiß... dirty-way. Aber funktioniert.
Maybe auch direkt alles in eine Datei... die wird mitunter groß (Stichwort: Redundanzen), macht die Bearbeitung aber umso einfacher.
Gruß
Fabian
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!