![]() |
Re: Wörter in einem String isolieren
Zitat:
|
Re: Wörter in einem String isolieren
@everdream
Du meinst also meine Datei erst in Excel in xml bringen und dann mit Delphi einlesen? Sry, das aufspliten habe ich folgendermaßen gemacht
Delphi-Quellcode:
procedure Split(const aValue, aDelimiterChars: string; var Result: TStringList);
var p, len: integer; s: string; begin if Result = nil then Result := TStringList.Create; Result.Clear; S := ''; p := 1; len := Length(aValue); while p <= len do begin if Pos(aValue[p], aDelimiterChars) = 0 then begin s := s + aValue[p]; Inc(p); end else begin Result.Add(s); s := ''; Inc(p); while (Pos(aValue[p], aDelimiterChars) <> 0) and (p <= len) do Inc(p); end; end; if s <> '' then Result.Add(s); end; |
Re: Wörter in einem String isolieren
Die Verwendung eines Parameters mit der ezeichnung result ist gefährlich, da er in Funktionen automatsich für den Rückgabewert genommen wird.
|
Re: Wörter in einem String isolieren
Hallo Sebastian,
man kämpft eigentlich immer an zwei Fronten: Problemverständnis und Lösungsansatz. Hier mal deine Problembeschreibung nach meinem Verständnis: Problem Statement Gegeben ist ein ANSI kodierter String mit folgendem Aufbau: Substring *(Separator Substring). Einem Substring folgen beliebig viele weitere Substrings, die durch einen Separator vom vorhergehenden Substring abgesetzt sind, wobei der Separator wechseln kann und aus beliebig vielen Zeichen bestehen darf. Das lässt sich wunderbar über Regular Expressions lösen, aber auch prozedural:
Delphi-Quellcode:
Deine Funktion Split() macht etwas ganz anderes. Wenn du ein Problem nicht zweifelsfrei beschreiben kannst, dann sind repräsentative Daten oft sehr hilfreich.
procedure Split(const line: string; const separators: array of string; strings: TStrings);
var iPos, iSep, iStart: Integer; begin if Length(separators) = 0 then strings.Text := line else begin strings.Clear; iStart := 1; iSep := 0; while iStart <= Length(line) do begin if iSep < Length(separators) then iPos := PosEx(separators[iSep], line, iStart) else iPos := 0; if iPos = 0 then begin strings.Add(Trim(Copy(line, iStart, MaxInt))); iStart := Succ(Length(line)); end else begin strings.Add(Trim(Copy(line, iStart, iPos - iStart))); iStart := iPos + Length(separators[iSep]); iSep := Succ(iSep); end; end; end; end; procedure TDemoForm.TestButtonClick(Sender: TObject); begin Split( 'von Kalkreuth Elfi Bad Salzuflen An der Burg 42 +49 69 1234-567', [' ', ' ', ' ', ' ', ' '], Memo.Lines ); end; Die von dir beschriebenen Trenner bergen die Gefahr, dass sie auch als Bestandteil eines Substring auftreten können, wenn keine Vorkehrungen getroffen werden, die das verhindern. Dieses Problem wird beim Format Comma Separated Values (CSV) u.a. durch Einführung eines Feldbegrenzungszeichens gelöst. Grüße vom marabu |
Re: Wörter in einem String isolieren
Hallo marabu,
danke für deine Erklärung. Ich werde mir angewöhnen die Aufgabenstellung klarer zu spezifizieren. (bin noch Einsteiger) Das von dir beschriebene Problemstatement müßte noch ergänzt werden. Mein Ziel ist es, jede Zeile in einem Record zu speichern. "von Kalkreuth Elfi Bad Salzuflen An der Burg 42 +49 69 1234-567" würde dann Person1.Nachname, Person1.Name, Person1.Wohnort, Person1..... entsprechen. Mit dem aufsplitten des Textes wollte ich mir das Erstellen der Records vereinfachen. Gruß Sebastian |
Re: Wörter in einem String isolieren
Hallo Sebastian,
Zitat:
Zitat:
Zitat:
Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 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