Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stringliste nach Zeichen trennen und auslesen (https://www.delphipraxis.net/167773-stringliste-nach-zeichen-trennen-und-auslesen.html)

MicA 17. Apr 2012 16:33

Delphi-Version: 7

Stringliste nach Zeichen trennen und auslesen
 
Hallo,

ich versuche schon den ganzen Tag über eine Funktion zu schreiben mit der sich eine Stringliste nach bestimmten Werten durchsuchen lässt. Es gibt ja bereits einige Vorschläge für dieses Problem, aber irgendwie bekomm ich das nicht auf die Reihe.

Im Wesentlichen soll eine Stringliste mit dieser Form durchsucht werden:

*SIGNAL* NetC32_1
C32.1 C45.1 C47.1 C48.1 E6.2 U2.B7 U2.M3 U2.M4 U2.M7 U2.M8 U2.N5 X16.1
X16.6 X16.7 X16.12
*SIGNAL* NetC51_1
C51.1 R56.1 R57.1

Dabei soll das Wort *SIGNAL* ein Trennzeichen darstellen und der Wert dahinter ausgelesen werden, so dass ich diesen String später wieder weiter verwenden kann.

Ich habe nun mehrere Möglichketen probiert. Beispielsweise den Ansatz mit Delimiter oder for sowie if-Schleifen, aber ich schaffe es einfach nicht, dass *SIGNAL* als einziges Trennzeichen akzeptiert wird.

Im Prinzip habe ich schon einiges ausprobiert, momentan arbeite ich noch mit diesem Stückchen Code:

NetList.LoadFromFile(Filepath);

ShowMessage(NetList.Text);

StringList.Delimiter := ' ';
StringList.QuoteChar := '*SIGNAL*';
StringList.DelimitedText := NetList.ToString;

ShowMessage(StringList.Text);

Ist es irgenwie möglich, den Code noch so abzuändern, dass die Liste an den Stellen mit *SIGNAL* getrennt wird und anschließend der Wert dahinter ausgelesen werden kann? Ich wäre um jede Hilfe dankbar!

DeddyH 17. Apr 2012 16:37

AW: Stringliste nach Zeichen trennen und auslesen
 
Hallo und Willkommen in der DP :dp:,

willst Du nur die Zeilen mit *SIGNAL*, oder auch die anderen?

mkinzler 17. Apr 2012 16:42

AW: Stringliste nach Zeichen trennen und auslesen
 
Beginn mit Pos()/PosEx() suchen und dann ab Findeposition plus Trennerlänge weitersuchen

Popov 17. Apr 2012 17:04

AW: Stringliste nach Zeichen trennen und auslesen
 
Vielleicht kannst du damit etwas anfangen, Anregungen holen, es eventuell anpassen:

Delphi-Quellcode:
function DelimTextToCommaText(sText: String; sDel: String): String;
begin
  with TStringList.Create do try
    while Length(sText) <> 0 do begin
      if Pos(sDel, sText) = 0 then sText := sText + sDel;
      Add(Trim(Copy(sText, 1, Pos(sDel, sText) - 1)));
      System.Delete(sText, 1, Pos(sDel, sText) + Length(sDel) - 1);
    end;
    Result := CommaText;
  finally Free end;
end; {Popov}

procedure TForm1.Button1Click(Sender: TObject);
var
  Text, Del: String;
begin
  Text := '254#*-#24#*-#250#*-#138#*-#186#*-#162#*-#190#*-#128';
  Del := '#*-#';
  ListBox1.Items.CommaText := DelimTextToCommaText(Text, Del);
end;
Es ist zwar nicht ganz das was du suchst, geschrieben habe ich es mal, weil es bei D3 TStringList kein DelimiterText gab. Zufällig zerlegt es einen String mit jedem Trennbegriff.

p80286 17. Apr 2012 17:19

AW: Stringliste nach Zeichen trennen und auslesen
 
Wie wäre es mit sortieren,
Zeilen die nicht mit *SIGNAL* beginnen löschen,
aus dem Rest *Signal* löschen,
fettig.

nicht elegant aber einfach.

Gruß
K-H

Sir Rufo 17. Apr 2012 22:13

AW: Stringliste nach Zeichen trennen und auslesen
 
[OT]
Zitat:

Zitat von MicA (Beitrag 1162322)
... oder for sowie if-Schleifen, ...

aua
[/OT]

Popov 17. Apr 2012 23:55

AW: Stringliste nach Zeichen trennen und auslesen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1162393)
aua

Im Leben ist alles Möglich, sogar eine If-Endlos-Schleife ;)
Delphi-Quellcode:
label
  a;
begin
  a: if True then Goto a;
end;

Perlsau 18. Apr 2012 02:07

AW: Stringliste nach Zeichen trennen und auslesen
 
Zitat:

Zitat von Popov (Beitrag 1162401)
Im Leben ist alles Möglich, sogar eine If-Endlos-Schleife ;)
Delphi-Quellcode:
label
  a;
begin
  a: if True then Goto a;
end;

Trotzdem "AUA"! Wer so programmiert, sollte wieder zu QuickBasic wechseln :?

Sir Rufo 18. Apr 2012 07:56

AW: Stringliste nach Zeichen trennen und auslesen
 
Zitat:

Zitat von Popov (Beitrag 1162401)
Zitat:

Zitat von Sir Rufo (Beitrag 1162393)
aua

Im Leben ist alles Möglich, sogar eine If-Endlos-Schleife ;)
Delphi-Quellcode:
label
  a;
begin
  a: if True then Goto a;
end;

Das ist doppelt aua, denn das Schleifenelement ist nicht if sondern goto und label

if ist und bleibt eine Bedingung und wird auch nicht durch (un-)geschickte Kombination zu einer Schleife

Neutral General 18. Apr 2012 08:15

AW: Stringliste nach Zeichen trennen und auslesen
 
Müsste es nicht reichen wenn er bei seiner Stringliste einfach

Delphi-Quellcode:
StringList.StrictDelimiter := true;
setzt?

DeddyH 18. Apr 2012 08:43

AW: Stringliste nach Zeichen trennen und auslesen
 
StrictDelimiter gab es unter Delphi 7 noch nicht.

Bummi 18. Apr 2012 10:07

AW: Stringliste nach Zeichen trennen und auslesen
 
Wie sollte dem Delimiter (Char) denn *SIGNAL* zugewiesen werden?

oder habe ich etwas verpasst ....

MicA 18. Apr 2012 10:23

AW: Stringliste nach Zeichen trennen und auslesen
 
Hallo und Danke schonmal für die vielen Antworten!

Erstmal: es sollen alle Zeilen weiterverarbeitet werden! *SIGNAL* ist nur das Trennzeichen!

Zusätzlich sollte ich noch ergänzen, dass ich nicht wirklich ein Programmierer bin: hab Elektrotechnik studiert und bis jetzt nur mit etwas C Code gearbeitet. Deshalb entschuldige ich mich schonmal im Voraus, falls ein Ansatz von mir nicht wirklich Sinn macht! Und das mit der if-Schleife...

Der Ansatz mit Pos und PosEx würde mir ganz gut gefallen. hab auch schon rumprobiert, aber die Funktion PosEx kann ich nicht aufrufen, offensichtlich ist die in meiner Delphi Version nicht enthalten!? Gibt es da eine Möglichkeit die anderweitig hinzuzufügen?

StrictDelimiter funktioniert nicht, das habe ich schon probiert.

Gruß Michael

Gollum 18. Apr 2012 10:27

AW: Stringliste nach Zeichen trennen und auslesen
 
Hallo,

PosEx gibt es unter D7. Du musst die Unit StrUtils einbinden.

DeddyH 18. Apr 2012 10:35

AW: Stringliste nach Zeichen trennen und auslesen
 
Wie wäre es denn mit
Delphi-Quellcode:
Stringlist.Text := StringReplace(Stringlist.Text, '*SIGNAL*', sLineBreak, [rfReplaceAll, rfIgnoreCase]);
oder so in der Art?

MicA 18. Apr 2012 10:47

AW: Stringliste nach Zeichen trennen und auslesen
 
Wie genau binde ich diese Unit ein? Ich sollte auch noch erwähnen, dass ich das EDA Programm Altium verwende und versuche ein Script zu erstellen. Ist es bei Altium überhaupt möglich eine Unit einzubinden?

MicA 18. Apr 2012 10:57

AW: Stringliste nach Zeichen trennen und auslesen
 
Zitat:

Stringlist.Text := StringReplace(Stringlist.Text, '*SIGNAL*', sLineBreak, [rfReplaceAll, rfIgnoreCase]); oder so in der Art?
Dafür bekomme ich eine Fehlermeldung: Could not convert variant of type (Array Variant) into type (Integer)

p80286 18. Apr 2012 11:08

AW: Stringliste nach Zeichen trennen und auslesen
 
Zitat:

Zitat von MicA (Beitrag 1162486)
Wie genau binde ich diese Unit ein? Ich sollte auch noch erwähnen, dass ich das EDA Programm Altium verwende und versuche ein Script zu erstellen. Ist es bei Altium überhaupt möglich eine Unit einzubinden?

ÄH? Was denn nun? Delphi oder nicht Delphi, das ist hier die Frage.

Gruß
K-H

MicA 18. Apr 2012 12:00

AW: Stringliste nach Zeichen trennen und auslesen
 
Zitat:

ÄH? Was denn nun? Delphi oder nicht Delphi, das ist hier die Frage
Ich schreibe ein Script in der Sprache Delphi. Allerdings mit der Entwicklungsumgebung von Altium Designer

http://wiki.altium.com/display/ADOH/...ript+Reference

DeddyH 18. Apr 2012 12:13

AW: Stringliste nach Zeichen trennen und auslesen
 
Zitat:

DelphiScript does not have Set types and does not support Set operators unlike the Object Pascal language which does have Set types and supports Set operators.
Deshalb funktioniert auch das StringReplace nicht.

Gollum 18. Apr 2012 12:28

AW: Stringliste nach Zeichen trennen und auslesen
 
Hallo,

vielleicht so?

Delphi-Quellcode:
procedure GetSignalListe(source, dest:TStringList);
const
  sSearch='*SIGNAL*';
var
  i:Integer;
  s:String;
begin
  dest.Clear();
  for i:=0 to source.Count-1 do
  begin
    s:=source.Strings[i];
    if Pos(sSearch, s)>0 then
      dest.Add(Copy(s, Length(sSearch)+1, Length(s)-Length(sSearch)-1);
  end; // for i
end; // GetSignalListe
...
...
NetList.LoadFromFile(Filepath);
SignalListe:=TStringList.Create();
  ....
  GetSignalListe(NetList, SignalListe);
  ShowMessage(SignalListe.Text);
  ...
SignalListe.Free();
...

MicA 18. Apr 2012 13:19

AW: Stringliste nach Zeichen trennen und auslesen
 
Hallo Gollum, vielen Dank für deinen Beitrag. Ich habe die Prozedur nochmals leicht angepasst, aber beim ausführen passiert nichts!? Normalerweise müsste sich das Programm doch einem neuen Projekt in dieser Form ausführen lassen, so dass für die Message Boxen auch was angezeigt werden müsste, oder!?

Code:
Procedure GetSignalListe(source, dest:TStringList);
const
   sSearch='*SIGNAL*';
Var
   i:Integer;
   s:String;
   NetList : TStringList;
   SignalListe : TStringList;

begin;
   NetList := TStringList.Create;

   dest.Clear();
   for i:=0 to source.Count-1 do
   begin
     s:=source.Strings[i];
     if Pos(sSearch, s)>0 then
       dest.Add(Copy(s, Length(sSearch)+1, Length(s)-Length(sSearch)-1));
   end; // for i
 end;
 NetList.LoadFromFile('C:\Users\Name\Desktop\Test.NET');
 SignalListe:=TStringList.Create();

{..............................................................................}

ShowMessage(NetList.Text);

GetSignalListe(NetList, SignalListe);

ShowMessage(SignalListe.Text);

 SignalListe.Free();
{..............................................................................}
End.

Gollum 18. Apr 2012 13:38

AW: Stringliste nach Zeichen trennen und auslesen
 
Delphi-Quellcode:
Procedure GetSignalListe(source, dest:TStringList);
const
   sSearch='*SIGNAL*';
Var
   i:Integer;
   s:String;
begin;
  dest.Clear();
  for i:=0 to source.Count-1 do
  begin
    s:=source.Strings[i];
    if Pos(sSearch, s)>0 then
      dest.Add(Copy(s, Length(sSearch)+1, Length(s)-Length(sSearch)-1));
  end; // for i
end;
Du darfst nicht innerhalb o.g. Procedure deine Listen initialisieren. Dies muss/sollte im Hauptprogramm oder wo auch immer passieren.

Delphi-Quellcode:
{..............................................................................}
  NetList:=TStringList.Create;
  NetList.LoadFromFile('C:\Users\Name\Desktop\Test.NET');
 
  SignalListe:=TStringList.Create();
  GetSignalListe(NetList, SignalListe);
  ShowMessage(SignalListe.Text);
  SignalListe.Free();
{..............................................................................}

MicA 20. Apr 2012 14:56

AW: Stringliste nach Zeichen trennen und auslesen
 
Hallo!

Vielen Dank nochmals für eure hilfe. Gollums Ansatz hat mir eigentlich sehr gefallen. Aber ich habe nun noch auch nochmals um die Hilfe eines Kollegen gebeten und letztendlich bin ich auf diese Lösung gekommen. Mit Sicherheit nicht der schönste Weg, das Problem zu lösen. Aber es funktioniert soweit.

Code:
     o:=0;
     StringList.Delimiter := '\n';
     StringList.DelimitedText := NetList.Text;

     for m := 0 to StringList.Count-1 do
     Begin
          if (StringList[m]) <> '*END*' then
          Begin
                if (StringList[m]) <> '*SIGNAL*' then inc(m)
                else
                    Begin
                         inc(m);
                         SignalName := Stringlist[m];
                         inc(m);
                         o := m;
                         while (((StringList[o]) <> '*SIGNAL*') AND ((StringList[o]) <> '*END*')) do inc(o);
                         if (o-m) < 3 then NewList.Add(SignalName);
                    End;
         End;
     End;
Vielen Dank nochmal und schönes Wochenende!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:21 Uhr.

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