Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wörter in einem String isolieren (https://www.delphipraxis.net/113897-woerter-einem-string-isolieren.html)

S20000 16. Mai 2008 12:56


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

Sharky 16. Mai 2008 12:58

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.

Hansa 16. Mai 2008 13:00

Re: Wörter in einem String isolieren
 
Dann mache den Rest mit "Trim". -> F1

mkinzler 16. Mai 2008 13:02

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.

Hansa 16. Mai 2008 13:13

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:

Sherlock 16. Mai 2008 13:14

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

Hansa 16. Mai 2008 13:24

Re: Wörter in einem String isolieren
 
Yes indead. :mrgreen: Für überflüssige Leerzeichen ist immer Trim zuständig !

guidok 16. Mai 2008 13:36

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.

S20000 18. Mai 2008 22:41

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

everdream 19. Mai 2008 01:41

Re: Wörter in einem String isolieren
 
Du könntest deine Tabelle in eine XML-Datei speichern. Dazu gibt es beim Delphitreff ein übersichtliches Tutorial.

Hansa 19. Mai 2008 03:52

Re: Wörter in einem String isolieren
 
Zitat:

Zitat von S20000
das aufsplitten der Liste habe ich jetzt hinbekommen.
Ich hätte noch eine weitere Frage...

Toll. :mrgreen: Nur wie ? Denkanstöße sind im Entwickler 4/2004 zu finden.

S20000 19. Mai 2008 08:01

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;

mkinzler 19. Mai 2008 08:21

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.

marabu 19. Mai 2008 11:28

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:
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;
Deine Funktion Split() macht etwas ganz anderes. Wenn du ein Problem nicht zweifelsfrei beschreiben kannst, dann sind repräsentative Daten oft sehr hilfreich.

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

S20000 19. Mai 2008 11:52

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

marabu 19. Mai 2008 12:50

Re: Wörter in einem String isolieren
 
Hallo Sebastian,

Zitat:

Zitat von S20000
... Ich werde mir angewöhnen die Aufgabenstellung klarer zu spezifizieren. (bin noch Einsteiger) ...

das wäre schön, wenn man sich das einfach angewöhnen könnte. Ich denke, es hat eher etwas mit Erfahrung (nicht nur im IT-Bereich) zu tun.

Zitat:

Zitat von S20000
... Das von dir beschriebene Problemstatement müßte noch ergänzt werden. Mein Ziel ist es, jede Zeile in einem Record zu speichern. ...

Die Zerlegung eines Strings anhand eines Musters ist ein in sich abgeschlossenes Problem. Was du mit den auf diese Weise gewonnenen Substrings machst steht auf einem ganz anderen Blatt.

Zitat:

Zitat von S20000
... Mit dem aufsplitten des Textes wollte ich mir das Erstellen der Records vereinfachen. ...

Deine Entscheidung war goldrichtig, es geht ja garnicht anders.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr.

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