Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Anfängerfrage - Mehere Zeilen auslesen (https://www.delphipraxis.net/107206-anfaengerfrage-mehere-zeilen-auslesen.html)

gerry22 24. Jan 2008 01:19


Anfängerfrage - Mehere Zeilen auslesen
 
Hallo,

ich habe in ein Memofeld eine Textdatei (Liste) geladen. Diese Textdatei hat folgendes Format:
Code:
Zeile mit Schlüsselwort 1
Nun kommen mehere
Zeilen unterschiedlicher Anzahl
und Länge
Zeile mit Schlüsselwort 2
Wieder mehere Zeilen
unterschiedlicher Anzahl
und Länge
Zeile mit Schlüsselwort 3
Wieder mehere Zeilen
unterschiedlicher Anzahl
und Länge
Zeile mit Schlüsselwort 1
Wieder mehere
Zeilen unterschiedlicher Anzahl
und Länge
Zeile mit Schlüsselwort 2
Wieder mehere Zeilen
unterschiedlicher Anzahl
und Länge
Zeile mit Schlüsselwort 3
Wieder mehere Zeilen
unterschiedlicher Anzahl
und Länge
Zeile mit Schlüsselwort 1
Wieder mehere
Zeilen unterschiedlicher Anzahl
und Länge
Zeile mit Schlüsselwort 2
Wieder mehere Zeilen
unterschiedlicher Anzahl
und Länge
Zeile mit Schlüsselwort 3
Wieder mehere Zeilen
unterschiedlicher Anzahl
u.s.w. Die Schüsselworte sind immer gleich - die Datensätze sind natürlich verschieden. Das ganze kann sich beliebig oft wiederholen.

Ich möchte einzelne Zeilen in ein zweites Memofeld laden und dabei folgendes Format erzielen:
Code:
Schlüsselwort 1
Text zwischen Schlüsselwort 2 und Schlüsselwort 3
Schlüsselwort 1
Text zwischen Schlüsselwort 2 und Schlüsselwort 3
Schlüsselwort 1
Text zwischen Schlüsselwort 2 und Schlüsselwort 3
Bisher habe ich folgendes versucht, aber ich komme nicht weiter.
Delphi-Quellcode:
var i: integer;
    m: integer; // Zeilennummer Schlüsselwort 2
    q: integer; // Zeilennummer Schlüsselwort 3
    ti: string; // Zeileninhalt Schlüsselwort 1

begin

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

   if Pos('Schlüsselwort 1' , Memo1.Lines.Strings[i]) <> 0 then
      begin
        ti:= Memo1.Lines.Strings[i];
        Memo2.Lines.Add(ti);
        end;

   if Pos('Schlüsselwort 2' , Memo1.Lines.Strings[i]) <> 0 then
      begin
        m:= i;
        Memo2.Lines.Add ('m ' +(intToStr(i))); // Zeilen-Nr. SW2
      end;

   if Pos('Schlüsselwort 3' , Memo1.Lines.Strings[i]) <> 0 then
      begin
        q:= i;
        Memo2.Lines.Add ('q ' +(intToStr(i))); // Zeilen-Nr. SW3
      end;

    if (i > m) and (i < q) then
      begin
      Memo2.Lines.Add(intToStr(i));
      end;

  end;
end;
Wie kann ich den Text zwischen Schlüsselwort 2 und 3 in mehrmals nacheinander auslesen ?
Ich wäre für jeden Tipp dankbar.

mkinzler 24. Jan 2008 05:36

Re: Anfängerfrage - Mehere Zeilen auslesen
 
Betrachte nicht die einzelen Zeilen, sondern den gesamten Text des Memos.

marabu 24. Jan 2008 06:11

Re: Anfängerfrage - Mehere Zeilen auslesen
 
Herzlich willkommen in der Delphi-PRAXiS, gerry22.

Ich sehe da einen Standardanwendungsfall für einen Zustandsautomaten.

Delphi-Quellcode:
const
  S_KEY1 = 'Schlüsselwort 1';
  S_KEY2 = 'Schlüsselwort 2';
  S_KEY3 = 'Schlüsselwort 3';

type
  TTransformState = (xsWait1, xsWait2, xsWait3);

procedure Transform(sIn, sOut: TStrings; const keywords: array of string);
var
  xs: TTransformState;
  i: Integer;
begin
  xs := xsWait1;
  Assert(Length(keywords) = 3);
  sOut.BeginUpdate;
  sOut.Clear;
  for i := 0 to Pred(sIn.Count) do
    case xs of
      xsWait1: // wait for keyword 1
      begin
        Inc(xs, Ord(AnsiContainsText(sIn[i], keywords[Ord(xs)])));
        if xs = xsWait2 then
          sOut.Add(sIn[i]);
      end;
      xsWait2: // wait for keyword 2
      begin
        Inc(xs, Ord(AnsiContainsText(sIn[i], keywords[Ord(xs)])));
      end;
      xsWait3: // wait for keyword 3
        if AnsiContainsText(sIn[i], keywords[Ord(xs)])
          then xs := xsWait1
          else sOut.Add(sIn[i]);
    end;
  sOut.EndUpdate;
end;

// Test: Transform(Memo1.Lines, Memo2.Lines, [S_KEY1, S_KEY2, S_KEY3]);
Freundliche Grüße

gerry22 24. Jan 2008 20:59

Re: Anfängerfrage - Mehere Zeilen auslesen
 
Vielen Dank für die Antworten.

-zu mkinzler
Ich dachte ich muß das Memofeld zeilenweise durchsuchen lassen. Wenn die entsprechenden if-Abfragen ein Ergebnis in der Zeile finden dann soll es in Memofeld 2 übernommen werden.
Mein Fehler liegt eindeutig in der vierten if-Abfrage. Dort haben die Variablen s und q wahrscheinlich gar keinen Wert.

Kann ich die if-Abfragen eventuell mehr in einander verschachteln ?
in der Art:
Delphi-Quellcode:
if Pos('Schlüsselwort 2' , Memo1.Lines.Strings[i]) > 0 and
   Pos('Schlüsselwort 3' , Memo1.Lines.Strings[i]) < 0 then
   begin
   Memo2.Lines.Add(intToStr(i));
   end;
Welchen Wert liefert eigentlich der Befehl Pos ?

-zu marabu
Was ist ein Zustandsautomat ? Das ist leider (noch) ein wenig zu hoch für mich. Ich werde es natürlich testen und mich genau über die Fünktionen belesen.

Nochmals vielen Dank und viele Grüße

marabu 25. Jan 2008 06:15

Re: Anfängerfrage - Mehere Zeilen auslesen
 
Moin,

der Zustandsautomat ist ein Begriff aus der Automatentheorie. Wenn du den Beispielcode (ich habe einen DFSA = Deterministic Finite State Automaton implementiert, zu Deutsch DEA = Deterministischer Endlicher Automat) verstehst, dann kannst du diesen Begriff auch erstmal wieder verdrängen. Ansonsten hast du jetzt ein paar Suchwörter, unter denen du sicher weitergehende Informationen finden wirst, wenn dich das Thema wirklich interessiert.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz