![]() |
String in einer Stringliste an Trennzeichen zerlegen
Hallo zusammen,
Ich möchte aus meiner Telefonanlage einkommende Nummern auslesen, via Asterisk. Ich hab ein Problem und zwar hab ich einen sehr großen String mit Zeilenumbrüchen und möchte versuchen die Nummer zu extrahieren. Der String: Zitat:
Wie würdet ihr versuchen an die Nummer zu kommen? |
AW: String
Hallo,
TStringList LoadFromFile und dann die StringList durchlaufen und mit Pos(ZeilenString, 'CallerIDNum: ')=1 die richtige Zeile finden. Und zum Schluss mit Copy oder StringReplace die Nummer extrahieren. |
AW: String
Zitat:
Die String Variable ist bereits in Delphi gespeichert und mit Pos hab ich bereits die CallerIDNum ermittelt. Bzw eine Funktion geschrieben um auch andere Zeilen zu ermittelt: Zitat:
|
AW: String
Delphi-Quellcode:
var
sl: TStrings; .. try sl := TStringList.Create; sl.Text := Buffer; result := sl[sl.IndexOf( ContainString)]; finally sl.Free; end; |
AW: String
Wir wäre es denn hiermit:
Delphi-Quellcode:
function ExtractCallerID(const AFileName: string): string;
var lst: TStringList; begin lst := TStringList.Create; try lst.LoadFromFile(AFileName); lst.NameValueSeparator := ':'; Result := Trim(lst.Values['CallerIDNum']); finally lst.Free; end; end; |
AW: String
:thumb: elegant wie immer...
|
AW: String
Ah Okay, ich hab den Kontext von TStringlist falsch aufgefasst.
@edit: Funktioniert, wieder was dazu gelernt. Nochmals vielen dank. |
AW: String in einer Stringliste an Trennzeichen zerlegen
Ich habe den Titel mal etwas aussagekräftiger formuliert.
|
AW: String in einer Stringliste an Trennzeichen zerlegen
Nur der Vollständigkeit halber :)
Delphi-Quellcode:
function GetCallerId(str: string): string;
var Match: TMatch; begin result := ''; Match := TRegex.Create('CallerIDNum:(.*)').Match(str); if Match.Success then result := Trim(Match.Groups[1].Value); end; |
AW: String in einer Stringliste an Trennzeichen zerlegen
Dann würde ich mir doch lieber das Trim sparen und per RegEx auch nur den Wert ohne Leerzeichen holen:
CallerIDNum: *(.*) |
AW: String in einer Stringliste an Trennzeichen zerlegen
Kann ich als Trennzeichen auch #13#10 verwenden ?
Bspw.:
Code:
Ich möchte die Events auch trennen. In dem Buffer können beliebig viele Events kommen, mal 1 oder mal 4. D.h. ich müsste es irgendwie mit einer eof schleife durchgehen oder?
Event: DialBegin
Privilege: call,all Channel: PJSIP/1177-00000638 ChannelState: 4 ChannelStateDesc: Ring CallerIDNum: 1177 CallerIDName: IT Test ConnectedLineNum: ConnectedLineName: Language: de AccountCode: Context: macro-dial Exten: s Priority: 65 Callid: 1022539411-5060-31@BA.BHC.CF.BCA Linkedid: 1557992134.3754 PageFlag: false Application: Dial Reg_calleenum: Reg_callernum: Reg_callername: Uniqueid: 1557992134.3754 DestChannel: PJSIP/1126-00000639 DestChannelState: 0 DestChannelStateDesc: Down DestCallerIDNum: 1126 DestCallerIDName: Martin DestConnectedLineNum: 1177 DestConnectedLineName: IT Test DestLanguage: de DestAccountCode: DestContext: callee-handler DestExten: s DestPriority: 12 DestCallid: b8fad6fc-4053-4b2d-ad90-13773452ebe2 DestLinkedid: 1557992134.3754 DestPageFlag: false DestApplication: Set DestReg_calleenum: DestReg_callernum: DestReg_callername: DestUniqueid: 1557992135.3755 DialString: 1126/sip:1126@10.172.25.125:5060 Event: NewConnectedLine Privilege: call,all Channel: PJSIP/1177-00000638 ChannelState: 4 ChannelStateDesc: Ring CallerIDNum: 1177 CallerIDName: IT Test ConnectedLineNum: 1126 ConnectedLineName: Martin Language: de AccountCode: Context: macro-dial Exten: s Priority: 65 Callid: 1022539411-5060-31@BA.BHC.CF.BCA Linkedid: 1557992134.3754 PageFlag: false Application: Dial Reg_calleenum: Reg_callernum: Reg_callername: Uniqueid: 1557992134.3754 Bei Trim(Eventlst.Values['Event']); nimmt dieser nur das 1. Event auf, nicht das 2. oder evtl 3. oder 4. Gibt es eine Möglichkeit an die auch zu kommen? |
AW: String in einer Stringliste an Trennzeichen zerlegen
.. für die StringList ist #13#10 die Markierung um eine neue Zeile anzulegen.
Als Delimiter kann man meines Wissens nur ein Zeichen verwenden. trim kannst Du dann auf die einzelen Zeilen der StringList anwenden. Grüße Klaus |
AW: String in einer Stringliste an Trennzeichen zerlegen
Zitat:
Delphi-Quellcode:
procedure HandleData(Source: TStrings);
var CallerID: string; EventName: string; begin if Source.Count = 0 then Exit; EventName := Trim(Source.Values['Event']); CallerID := Trim(Source.Values['CallerIDNum']); end; procedure HandleFile(const AFileName: string); var line: string; lst: TStringList; reader: TStreamReader; begin reader := TStreamReader.Create(AFileName); try lst := TStringList.Create; try lst.NameValueSeparator := ':'; while not reader.EndOfStream do begin line := reader.ReadLine; if Trim(line) = '' then begin HandleData(lst); lst.Clear; end else begin lst.Add(line); end; end; { falls als letztes keine Leerzeile mehr kam } HandleData(lst); finally lst.Free; end; finally reader.Free; end; end; |
AW: String in einer Stringliste an Trennzeichen zerlegen
Wozu #13#10 als Trennzeichen verwenden? Dann kannst du doch einfach jede Zeile direkt durchgehen und ausgeben lassen.
Ein Beispiel wie ich es aktuell nutze, mal für dich etwas angepasst. Hab es aber nicht testen können.
Delphi-Quellcode:
procedure Bla.ReadCSVClick(Sender: TObject);
var StringList : TStringList; row : Integer; Eventcounter : integer; begin Eventcounter := 0; StringList := TStringList.Create; try StringList.LoadFromFile('Stringlistfile.xxx'); for row := 0 to StringList.Count - 1 do begin if split(StringList.Strings[row], ':', 1) = 'Event' then //Wenn ein neues Event kommt; begin inc(Eventcounter); //definieren des Events end; //Mache was für das Event "Eventcounter" (Name des Events wäre split(StringList.Strings[row], ':', 2) end; finally StringList.Free; end; end; //String zerteilen function Split(text: string; delimiter: char; p: integer): string; var stl: TStrings; begin stl := TStringList.Create; try stl.delimiter := delimiter; stl.DelimitedText := text; finally result := stl.Strings[p]; stl.free; end; end; |
AW: String in einer Stringliste an Trennzeichen zerlegen
Zitat:
|
AW: String
Zitat:
Delphi-Quellcode:
kann man folgendes schreiben:
if Pos(ZeilenString, 'CallerIDNum: ')=1 then
Delphi-Quellcode:
if ZeilenString.StartsWith('CallerIDNum: ') then
Nur mal so zur Erinnerung - auch an mich selbst! :-D |
AW: String
Zitat:
|
AW: String
Zitat:
|
AW: String in einer Stringliste an Trennzeichen zerlegen
Ich hab mich für einen etwas anderen Weg entschieden. Ohne die Anregungen wäre ich trotzdem nicht darauf gekommen, danke nochmals. :)
Code:
//Events auslesen (pro Buffer können 1-24 Events eingehen)
EventCounter := 0; for row := 0 to (lst.Count -1) do begin if ((lst.Strings[row]).StartsWith('Event')) then begin if(Eventlst.Count = 0) then // Nur beim 1. Event true begin Eventlst.Add(lst.Strings[row]); EventCounter := 1; end else begin handleEvent(Eventlst.Text); // Event handeln Eventlst.Clear; Eventlst.Add(lst.Strings[row]); EventCounter := EventCounter+1; end; end else begin Eventlst.Add(lst.Strings[row]); end; end; // Falls nur 1 Event im Buffer if (EventCounter = 1) then begin handleEvent(Eventlst.Text); // Event handeln Eventlst.Clear; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 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