![]() |
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! |
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? |
AW: Stringliste nach Zeichen trennen und auslesen
Beginn mit Pos()/PosEx() suchen und dann ab Findeposition plus Trennerlänge weitersuchen
|
AW: Stringliste nach Zeichen trennen und auslesen
Vielleicht kannst du damit etwas anfangen, Anregungen holen, es eventuell anpassen:
Delphi-Quellcode:
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.
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; |
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 |
AW: Stringliste nach Zeichen trennen und auslesen
[OT]
Zitat:
[/OT] |
AW: Stringliste nach Zeichen trennen und auslesen
Zitat:
Delphi-Quellcode:
label
a; begin a: if True then Goto a; end; |
AW: Stringliste nach Zeichen trennen und auslesen
Zitat:
|
AW: Stringliste nach Zeichen trennen und auslesen
Zitat:
if ist und bleibt eine Bedingung und wird auch nicht durch (un-)geschickte Kombination zu einer Schleife |
AW: Stringliste nach Zeichen trennen und auslesen
Müsste es nicht reichen wenn er bei seiner Stringliste einfach
Delphi-Quellcode:
setzt?
StringList.StrictDelimiter := true;
|
AW: Stringliste nach Zeichen trennen und auslesen
StrictDelimiter gab es unter Delphi 7 noch nicht.
|
AW: Stringliste nach Zeichen trennen und auslesen
Wie sollte dem Delimiter (Char) denn *SIGNAL* zugewiesen werden?
oder habe ich etwas verpasst .... |
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 |
AW: Stringliste nach Zeichen trennen und auslesen
Hallo,
PosEx gibt es unter D7. Du musst die Unit StrUtils einbinden. |
AW: Stringliste nach Zeichen trennen und auslesen
Wie wäre es denn mit
Delphi-Quellcode:
oder so in der Art?
Stringlist.Text := StringReplace(Stringlist.Text, '*SIGNAL*', sLineBreak, [rfReplaceAll, rfIgnoreCase]);
|
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?
|
AW: Stringliste nach Zeichen trennen und auslesen
Zitat:
|
AW: Stringliste nach Zeichen trennen und auslesen
Zitat:
Gruß K-H |
AW: Stringliste nach Zeichen trennen und auslesen
Zitat:
![]() |
AW: Stringliste nach Zeichen trennen und auslesen
Zitat:
|
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(); ... |
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. |
AW: Stringliste nach Zeichen trennen und auslesen
Delphi-Quellcode:
Du darfst nicht innerhalb o.g. Procedure deine Listen initialisieren. Dies muss/sollte im Hauptprogramm oder wo auch immer passieren.
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;
Delphi-Quellcode:
{..............................................................................}
NetList:=TStringList.Create; NetList.LoadFromFile('C:\Users\Name\Desktop\Test.NET'); SignalListe:=TStringList.Create(); GetSignalListe(NetList, SignalListe); ShowMessage(SignalListe.Text); SignalListe.Free(); {..............................................................................} |
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:
Vielen Dank nochmal und schönes Wochenende!
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; |
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