Ergebnis 1 bis 6 von 6
  1. #1
    Mitglied
    Registriert seit
    Feb 2010
    Beiträge
    26

    Standard Delphi 2007: Aus einer Stringliste einen Teilstring lesen

    Hallo,

    ich habe in einer Stringliste mehrere Teilstrings durch Simikolon getrennt.
    Der Inhalt sieht wie folgt aus:
    Maira;Müller;03.03.1965; Baumweg;17;44135;Dortmund
    Heinz;Meier;07.10.1948; Hühnerstraße;1;44135;Dortmund


    Jetzt möchte ich gerne jede Zeile der Stringliste durchgehen und nur folgendes ausgegeben bekommen.
    Müller;03.03.1965;Dortmund
    Meier;07.10.1948;Dortmund

    Also alles was zwischen dem ersten und dritten Semikolon steht und nach dem letzten Semikolon.

    for i := 0 to StrList.Count - 1 do
    begin

    Pos1 := Pos(';', StrLst.Strings[i]); // erstes simikolon
    Pos2 := PosEx(';', StrLst.Strings[i], Pos1); // zweites simikolon
    Test := Copy(StrLst.Strings[i], Pos2+1);

    Aber weiter weis ich nicht....
    Bin über jeden Tipp dankbar

  2. #2
    Skript Kiddy Avatar von Gehstock
    Registriert seit
    Aug 2005
    Beiträge
    800

    Standard Re: Delphi 2007: Aus einer Stringliste einen Teilstring lesen

    Ungetestet

    Code:
    function GetToken(aString, SepChar: string; TokenNum: Byte): string;
    var
      Token: string;
      StrLen: integer;
      Num: integer;
      EndofToken: integer;
    begin
      StrLen := Length(aString);
      Num := 1;
      EndofToken := StrLen;
      while ((Num <= TokenNum) and (EndofToken <> 0)) do
      begin
        EndofToken := Pos(SepChar, aString);
        if EndofToken <> 0 then
        begin
          Token := Copy(aString, 1, EndofToken - 1);
          Delete(aString, 1, EndofToken);
          Inc(Num);
        end
        else
          Token := aString;
      end;
      if Num >= TokenNum then
        Result := Token
      else
        Result := '';
    end;

    Code:
    var
    s : String;
    for i := 0 to StrList.Count - 1 do
     begin
     s := GetToken(StrLst.Strings[i], ';'2)+ GetToken(StrLst.Strings[i], ';'3)+ GetToken(StrLst.Strings[i], ';'7); 
    end;

  3. #3
    Geisterfahrerüberholer
    Registriert seit
    Apr 2006
    Beiträge
    4.720

    Standard Re: Delphi 2007: Aus einer Stringliste einen Teilstring lesen

    Warum so umständlich? Die Klasse TStringList bringt alle Funktionen dafür schon mit.
    Einfach jede Zeile via DelimitedText in eine neue TStringList laden und als Delimiter ';' verwenden. Und dann einfach die Elemente mit den gewünschten Index ausgeben.

    Also:
    Code:
    var
      adressen : TStringList;
      i    : Integer;
      eintrag : TStringList;
    begin
    
      adressen := TStringList.Create;
      adressen.Add('Maira;Müller;03.03.1965; Baumweg;17;44135;Dortmund');
      adressen.Add('Heinz;Meier;07.10.1948; Hühnerstraße;1;44135;Dortmund' );
    
      eintrag := TStringList.Create;
      eintrag.Delimiter := ';';
      for i := 0 to adressen.Count - 1 do begin
          eintrag.clear;
          eintrag.DelimitedText := adressen[i];
    
          // abschließend eintrag[1]+';'+eintrag[2]+';'+eintrag[6] ausgeben bzw. speichern
     end;
     adressen.Free;
     eintrag.Free;
    end;

    Ansonsten gibts für Delphi sicherlich auch Komponenten die CSV-Dateien einlesen können.

  4. #4
    Mitglied

    (Threadstarter)


    Registriert seit
    Feb 2010
    Beiträge
    26

    Standard Re: Delphi 2007: Aus einer Stringliste einen Teilstring lesen

    Das Problem ist, dass ich die Daten für die Stringliste aus mehreren Dateien einlesen und halt nicht alle Informationen benötige. Nächstes Problem, die "Teilstrings" sind nicht immer gleich lang...

    @ Gehstock: Könntest du mir dein Codebeispiel noch erklären?

  5. #5
    Skript Kiddy Avatar von Gehstock
    Registriert seit
    Aug 2005
    Beiträge
    800

    Standard Re: Delphi 2007: Aus einer Stringliste einen Teilstring lesen

    hatte jetzt endlichmal ne IDE zur Hand also hier die berichtigte Version

    Spoiler: 

    Code:
    unit Unit1;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private-Deklarationen }
      public
        { Public-Deklarationen }
      end;
    
    var
      Form1: TForm1;
      adressen : TStringList;
    
    implementation
    
    {$R *.dfm}
    
    function GetToken(aString, SepChar: string; TokenNum: Byte): string;
    var
      Token: string;
      StrLen: integer;
      Num: integer;
      EndofToken: integer;
    begin
      StrLen := Length(aString);
      Num := 1;
      EndofToken := StrLen;
      while ((Num <= TokenNum) and (EndofToken <> 0)) do
      begin
        EndofToken := Pos(SepChar, aString);
        if EndofToken <> 0 then
        begin
          Token := Copy(aString, 1, EndofToken);
          Delete(aString, 1, EndofToken);
          Inc(Num);
        end
        else
          Token := aString;
      end;
      if Num >= TokenNum then
        Result := Token
      else
        Result := '';
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
    s : String;
    i : Integer;
    begin
    for i := 0 to adressen.Count - 1 do//stringlist durchsuchen
     begin
     s := GetToken(adressen.Strings[i], ';',2) //sucht das zweite Vorkommen vom Trennzeichen ";" und zeigt den Text davor an bis zum letzten Trennzeichen
    + GetToken(adressen.Strings[i], ';',3)//das 3.
    + GetToken(adressen.Strings[i], ';',7);//und das 7.
    end;
    memo1.text :=s;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    
    begin
    
      adressen := TStringList.Create;
      adressen.Add('Maira;Müller;03.03.1965; Baumweg;17;44135;Dortmund');
      adressen.Add('Heinz;Meier;07.10.1948; Hühnerstraße;1;44135;Dortmund' );
    
    
    end;
    
    end.

  6. #6
    Geisterfahrerüberholer
    Registriert seit
    Apr 2006
    Beiträge
    4.720

    Standard Re: Delphi 2007: Aus einer Stringliste einen Teilstring lesen

    Zitat Zitat von Mamamiaaa Beitrag anzeigen
    Das Problem ist, dass ich die Daten für die Stringliste aus mehreren Dateien einlesen und halt nicht alle Informationen benötige.
    Wo ist da das Problem? in meinen Beispiel, kannst du dir anschließend die Einträge aus den einzelnen Zeilen herraus suchen, die du benötigst. Prinzipell macht das Beispiel von Gehstock auch nichts anderes.

    Zitat Zitat von Mamamiaaa Beitrag anzeigen
    Nächstes Problem, die "Teilstrings" sind nicht immer gleich lang...
    Was meinst du mit nicht gleich lang? Falls verschiedene Dateien eine unterscheidliche Anzahl von Einträgen pro Zeile besitzen, dann funktioniert auch der Code von Gehstock nicht. Dann müsstest du eigentlich für jede Datei ein sparates Interface entwickeln.

  7.  
     
     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •