Autor Beitrag
SiRoX
Hält's aus hier
Beiträge: 5

Windows 7 Ultimate
Delphi 2010
BeitragVerfasst: Mi 04.11.09 13:13 
Hallo! Ich bin Delphi Anfänger und mein erstes Projekt beinhaltet das Auslesen von config-Dateien.
Dabei soll die Datei nach '=' durchsucht werden und dann der Text in der Zeile links daneben als Variablenname und rechts daneben als deren Inhalt kopiert werden. Undzwar immer bis entweder ein ';' oder ein Leerzeichen die Reihe unterbricht.

Hier ein Beispiel aus einer Datei:

; Test
ConnectionForReporting=Provider=SQLOLEDB.1;Password=password,123;Persist Security Info=True;User ID=test;Initial Catalog=program_PD_1;Data Source=AFT-TLL-S-01
ReportConnection=Provider=SQLOLEDB.1;Password=password,123;Persist Security Info=True;User ID=test;Initial Catalog=program_PD_1;Data Source=AFT-TLL-S-01


DisableDBVersionCheck=False
DatabaseVersionFile=dbversion.config



Bisher habe bereits herausgefunden, wie man Zeilen/Strings nach '=' durchsucht und auch wie man komplette Zeilen nach dem '=' kopiert. Jedoch komme ich nicht darauf wie man links davon kopiert und wie man die Datei so einliest, dass es zeileinweise abgearbeitet werden kann usw.


Da mir noch viel (auch grundlegendes) Delphi-Wissen fehlt, wäre ich über Tipps von Euch sehr dankbar!
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mi 04.11.09 13:18 
Du kannst entweder PosEx (ab Delphi 7, Unit StrUtils) verwenden oder nach jedem kopieren den kopierten Teil mit Delete aus dem String löschen. Das ganze in einer while-Schleife:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
while pos('=', DeinString) > 0 do
begin
  Copy...
  Delete...
end;


EDIT: Eine weitere Möglichkeit wäre die Verwendung einer StringList und StringReplace:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var
  sl: TStrings;
  i: Integer;
begin
  sl := TStringsList.Create;
  try
    sl.LoadFromFile('...');
    sl.Text := StringReplace(sl.text, ';', sLineBreak, [rfReplaceAll]);
    //1. Param: String in dem gesucht werden soll, 2. Suchstring, 3. Wert zum ersetzen (hier ein Zeilenumbruch), 4. Alle Vorkommen ersetzen
    //Danach steht in jeder Zeile der StringList ein Wertepaar Blubb=XYZ
    for i := 0 to sl.Count -1 do
    begin
      //Alle Zeilen/Wertepaare durchgehen
      //Die müssen jetzt nur noch geteilt werden...
    end;
  finally
    sl.Free;
  end;
end;
SiRoX Threadstarter
Hält's aus hier
Beiträge: 5

Windows 7 Ultimate
Delphi 2010
BeitragVerfasst: Mi 04.11.09 14:36 
Danke für die schnelle Antwort! Das mit der Stringlist sieht ganz gut aus, nur habe ich das nicht auf Anhieb verstanden.
ausblenden Delphi-Quelltext
1:
sl.Text := StringReplace(sl.text, ';', sLineBreak, [rfReplaceAll]);					


Ich lade also zuerst den Inhalt aus der Datei in die Stringlist sl.
Dann ändere ich sl derart, dass ich in ihm nach ';' suche und an dieser Stelle einen Zeilenumbruch durchführe.
Der letzte Parameter dient dazu, dass es auf alle Zeilen angwendet wird.

Jetzt habe ich keine Zeilen mehr, die durch ein ';' unterbrochen sind. Das ist sehr gut!

Jetzt fehlt mir noch der Schritt, dass die Variablen aus den Namen links und mit den Werten rechts neben dem '=' erschaffen werden. Ist das denn möglich?
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mi 04.11.09 14:55 
Einfach so Variablen erschaffen geht natürlich nicht :) Du kannst bei der StringList der Eigenschaft NameValueSeparator ein = zuweisen. Anschließend sollte der Zugriff auf die einzelnen Werte so möglich sein:

ausblenden Delphi-Quelltext
1:
2:
DeineStringVar := Sl.Values['Password'];
//In DeineStringVar könnte jetzt password,123 stehen.


Schau dir doch bitte in der Delphi-Hilfe noch folgende Sachen an: TStringList.Names und .ValueFromIndex
SiRoX Threadstarter
Hält's aus hier
Beiträge: 5

Windows 7 Ultimate
Delphi 2010
BeitragVerfasst: Mi 04.11.09 16:29 
Danke für die Unterstützung, aber leider komme ich mit den Infos nicht weiter. Ich habe es jetzt wie folgt versucht:

ausblenden volle Höhe 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:
procedure Variablenzuweisung;
  var
  sl: TStrings;
  i: Integer;
  zahl : Integer;

begin
  sl := TStringList.Create;
  value := TStringList.Create;
  sl.NameValueSeparator :=  '=';
  zahl := 0;

  try
    sl.LoadFromFile(filename);
    sl.Text := StringReplace(sl.text, ';', sLineBreak, [rfReplaceAll]);

    for u := 0 to sl.Count -1

    do  begin                           
         b := sl[u];      //string zuweisen
         a := pos('=', b);                     //position vom '=' bestimmen

        if a <> 0 then begin
        g :=('gefunden in Spalte: ' + IntToStr(a)+' Zeile: '+ IntToStr(u+1) +'Zahl='+IntToStr(zahl));
         value.Add( copy(b, a+1, maxint) );
         zahl :=zahl+1;
        end
      end;

      finally
    sl.Free;

       end
 end; end.


Ich hatte mir gedacht, 'm' als weiteres Array bei jedem Schleifendurchgang jeweils eine neue Zeile bekommt. Aber das funktioniert nicht. Aus der Delphi Hilfe werde ich bezüglich der genannten Begriffe nicht wirklich schlau...
Danke

edit:
hab jetzt mal geupdated. So funktioniert's mit der neuen Liste! :)
Jetzt muss ich noch eine für die Werte links erschaffen und dann irgendwie Variablenzuweisungen aus den Listen generieren...