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