Entwickler-Ecke

Dateizugriff - Daten aus Textdatei in Variablen auslesen


bfelix - Mo 31.01.11 19:01
Titel: Daten aus Textdatei in Variablen auslesen
Hallo Community,
ich würde gerne Daten zur besseren Flexibilität eines Programms aus einer sauber gegliederten csv-datei o.ä. auslesen und dann in Arrays Speichern.
Danke schon im Voraus,
Felix


elundril - Mo 31.01.11 19:04

Mhm, das ist schön. tu nur, wir haben nichts dagegen. :mrgreen:


Was ich damit sagen will ist: Was ist konkret deine Frage, wo ist das Problem, wie sieht dein Ansatz dafür aus, was hast du durch Recherche im Internet rausgefunden?

lg elundril


bfelix - Mo 31.01.11 19:07

also gut... :roll:
wie kann ich die Datei auslesen und sie strukturiert in Variablen benutzen


Regan - Mo 31.01.11 19:08

In dem du die Datei mit einer Stringlist lädst, dann Zeile für Zeile durchgehst und die Werte speicherst. Du bekommst die einzelnen Element z. B. mit Pos heraus.


bfelix - Mo 31.01.11 19:10

nd wie sähe der code dazu ungefähr aus? ich kenn diese Befehle überhaupt nicht.

mfg
bfelix


elundril - Mo 31.01.11 19:11

bzw kann man auch delimiter und so dazu verwenden wenn man eh schon eine Stringlist verwendet.

Wie man das anwendet erfährst du am besten über die Hilfe (F1 in Delphi) oder über Google. ;) BZW, kannst du auch in der Forensuche sicher einiges dazu finden.

lg elundril


bummi - Mo 31.01.11 19:23

Vorschlag zum Einstieg

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:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyArray=Array of Array of String;
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  FMyArray: TMyArray;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
Var
  SL, ZSL:TStringList;
  i:Integer;
  Procedure FillRow;
    var
      ii:Integer;
    begin
      ZSL.Text := SL[i];
      ZSL.Delimiter := ';';
      SetLength(FMyArray[i], ZSL.Count);
      for ii := 0 to ZSL.Count - 1 do FMyArray[i][ii] := ZSL[ii];

    end;
begin
  SL:=TStringList.Create;
  ZSL:=TStringList.Create;
  try
    SL.LoadFromFile('C:\temp\test.csv');
    SetLength(FMyArray, SL.Count);
    for i  := 0 to SL.Count - 1 do
        begin
          FillRow;
        end;
  finally
    SL.Free;
    ZSL.Free;
  end;
end;

end.


gnomecoder - Mo 31.01.11 21:34

muss es ne Textdatei sein?
habe mit typisierten Dateien gute Erfahrungen gemacht: http://www.delphi-treff.de/tutorials/datenspeicherung/typisierte-dateien/einleitung/

edit: war wohl doch keine gute idee, du willst das programm ja flexibler machen. hab ich beim ersten mal überlesen.


bfelix - Mo 31.01.11 21:39

sind typisierte dateien im programm verankert oder extern?


gnomecoder - Mo 31.01.11 21:52

Extern, nur kannse die nicht einfach mim texteditor öffnen und Werte ändern, und darauf kams dir doch an wenn ich dich richtig verstanden habe.


bfelix - Mo 31.01.11 22:00

es muss nicht unbedingt ein texteditor sein, ich kann mir ja auch selbst einfach eine kleine software schreiben, die das übernimmt. danke für den tipp. Aber eine frage:
Definiert man einfach einen variablentyp als record, deklariert dann ein variable in diesem Typ und erstellt diese dann als datei oder habe ich da was falsch verstanden?


elundril - Di 01.02.11 04:19

Jain. Deine Formulierung ist ein bisschen zu vage. Wie genau typisierte Dateien aufgebaut sind, kannst du hier [http://www.delphi-treff.de/tutorials/datenspeicherung/typisierte-dateien/einleitung/] nachlesen.

Aber soviel gleich mal vorweg, typisierte Dateien <> CVS-Dateien. Wenn du in deinem Record 5 Stringvariablen mit der Länge 150 deklariert hast, dann kannst du Pro Record nur 5 Strings mit der Länge von 150 Zeichen einlesen. Das ist dann wie in Stein gemeißeltes Gesetz und das is zur Laufzeit auch starr. Hingegen mit Stringlists oder Array oder ähnlichem kannst du wirklich dynamisch auf den Aufbau eingehen. Und wenn ein String in der Datei mal 151 Zeichen hat, ist das der Stringlist oder dem Array egal.

lg elundril

//edit: oder du hast es schon nachgelesen, hoff ich, da der link hier schon mal gepostet wurde.


jasocul - Di 01.02.11 09:12

Warum nimmst du nicht einfach INI-Dateien?
Delphi liefert alles dafür mit.


pesi - Di 01.02.11 15:45

Hi,
wie wäre es denn wenn Du Dir mal VALUES genauer anschaust.
Du müsstest dann eine Textdatei haben in der Deine Werte mit einem Bezeichner stehe. Die lädst Du in Dein Programm ein (Stichwort "LoadFromFile") und kannst dann auf die Parameter die Du benötigst zugreifen.
Hier mal ein Auszug aus der Hilfe (D5):

Zitat:
Die Eigenschaft Values repräsentiert den Teil-String für Strings der Form “Bezeichner=Wert“.

property Values[const Name: string]: string;

Beschreibung

Enthält die String-Liste eines TStrings-Objekts Einträge in der Form “Bezeichner=Wert“, dann läßt sich mit der Eigenschaft Values auf den Teil-String zugreifen, der den Wert enthält. Enthält die Liste keine String-Einträge in dem erwarteten Format, oder entspricht keiner der String-Einträge dem Parameter Name, so gibt die Eigenschaft Values einen Leer-String zurück.

Strings mit diesem Format findet man gewöhnlich in INI-Dateien. Das folgende Beispiel entstammt einer DELPHI.INI-Datei:

DisplayGrid=1

SnapToGrid=1
GridSizeX=8
GridSizeY=8

Das Format “Bezeichner=Wert“ gilt übrigens auch für die Strings der Eigenschaft Params einer Datenbank-Komponente (TDatabase).

Der Teil-String Name steht als Bezeichner auf der linken Seite des Gleichheitszeichens (=), der aktuelle Wert rechts davon. Zwischen dem Gleichheitszeichen und den beiden Teil-Strings sind keine Leerzeichen zulässig.


Velleicht hilft das ja???
Gruß Peter

Moderiert von user profile iconGausi: b- durch Quote-Tags ersetzt.


elundril - Di 01.02.11 15:56

Bevor ihr ihn da jetzt mit INI-Tutorials und sonstwas überhäuft, schon mal überlegt ob er sich das Dateiformat selber aussuchen kann? Ev. wird ihm die CVS-datei von einem anderen Programm so geliefert, bzw von Kunden, Freunden oder ähnlichem. Da bringen ihm die InI-Dateien auch eher weniger, weil er trotzdem nur CVS vor sich liegen hat. ;)

BTW, würde ich von INIs eher abstand nehmen und wenn dann XMLs verwenden, da der Support von INIs nicht wirklich garantiert und veraltet ist. Außerdem wären XMLs viel flexibler als INIs.

lg elundril


jasocul - Di 01.02.11 16:33

@elundril:
Stimmt. Hast natürlich Recht. Asche auf mein Haupt.


bfelix - Di 01.02.11 17:18

Danke für die Tipps! Ich hab mich jetzt für typ. Dateien entschieden. Nein, ich bekomme keine Daten von Kunden, ich erstelle diese mit einem zusätzlichen selbstprogrammierten Programm.

mfg und nochmal Danke,
Felix