![]() |
Wörter in einem String isolieren
Hallo zusammen,
ich habe folgendes Problem. Ich habe eine StringListe mit einzelnen Strings(Zeilen) der Form: Name1 Name2 Name3 Name4 Name5 Name6 Name 1-3 haben 3 Leerzeichen zwischen den Wörtern, Name 4 und 5 - 4 Leerzeihen, und Name 5 und 6 haben 2 Leerzeichen. Nun möchte ich jeden String in eine Liste Auftrennen: Name1 Name2 ... Name6 Ich möchte also jedes Wort vereinzeln. (Ziel des ganzen ist später das Abspeichern jeder Zeile in einem Record mit Name1 Name2...., dazu muss ich aber die Elemente voneinander isolieren. Ich habe schon versucht die Aufgabe mit StrSplit zu lösen, damit kann ich aber nur auf einen Char abfragen. Z.B. " ". Ich habe aber mehrere Leerzeichen dazwischen?! Gruß Sebastian |
Re: Wörter in einem String isolieren
Hai S20000,
schreibe Dir doch eine kleine Funktion die die unnötigen Leerzeichen aus dem String entfernt. Bzw. Mit StringRepleace die vier bzw. zwei Leerzeichen durch eines ersetzen. |
Re: Wörter in einem String isolieren
Dann mache den Rest mit "Trim". -> F1
|
Re: Wörter in einem String isolieren
rim entfernt aber nur Leerzeichen am Anfang und Ende eines Strings. Ich wüsste nicht, wie das ihm helfen soll.
|
Re: Wörter in einem String isolieren
st : die Zeile, um die es geht. Er soll Trim (st) machen. Dann sind eventuelle Leerzeichen rechts und links schon mal weg. Dann bis zum nächsten Leerzeichen lesen. Das gelesene mit StringList.Add festhalten und mit delete (length (Wort) aus st löschen). Kommt jetzt nur ein Leerzeichen oder 44 ? Egal. Trim (st) usw. Ob das einer versteht ? No Time. :mrgreen:
|
Re: Wörter in einem String isolieren
Wie wäre es mit einer Routine, die durch den String läuft und jede Folge von nicht Leerzeichen in eine Stringliste kopiert? Das müsste doch einfach zu machen sein.
Edit: Hansa das ist wirklich zu einfach :mrgreen:, und damit ist es wirklich trivial umzusetzen. Sherlock |
Re: Wörter in einem String isolieren
Yes indead. :mrgreen: Für überflüssige Leerzeichen ist immer Trim zuständig !
|
Re: Wörter in einem String isolieren
Ich verwende für solche Sachen meist die Eigenschaften DelimitedText, Delimiter und StrictDelimiter einer TStringList.
Einfach den String der Eigenschaft DelimitedText zuweisen und über Strings[Index] auslesen. |
Re: Wörter in einem String isolieren
Hallo zusammen,
das aufsplitten der Liste habe ich jetzt hinbekommen. Ich hätte noch eine weitere Frage. Ist es möglich aus einer TXT-Datei automatisch eine Tabelle zu erzeugen? Mit liegt eine TXT Datei vor, die pro Zeile zusammengehörende Daten hat. z.B.: Nachname1 Vorname1 Wohnort1 Straße1 Hausnummer1 TelNummer1 Nachname2 Vorname2 Wohnort2 Straße2 Hausnummer2 TelNummer2 Nachname3 Vorname3 Wohnort3 Straße3 Hausnummer3 TelNummer3 Handynummer3 .. .. .. Am liebsten würde ich jetzt jede Zeile in einem eigenen Record speichern. Jede Person in der Liste bekommt einen eigenen Record. Daher die Frage, ob man am besten eine Tabelle o.ä. anlegt?! Oder wie würdet ihr die Informationen aus der Liste auslesen? Gruß Sebastian |
Re: Wörter in einem String isolieren
Du könntest deine Tabelle in eine XML-Datei speichern. Dazu gibt es beim Delphitreff ein übersichtliches
![]() |
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 12:07 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