Frage

Ich habe Probleme mit dem Trennzeichen in der TStringList Klasse. Werfen Sie einen Blick:

var
  s: string;
  sl: TStringList;

begin
  sl := TStringList.Create;
  s := 'Users^foo bar^bar foo^foobar^barfoo';
  sl.Delimiter := '^';
  sl.DelimitedText := s;
  ShowMessage(sl[1]);
end;

sl[1] zurückkehren sollte 'foo bar'

sl[1] zurückkehrt 'foo'

Es scheint, dass das Trennzeichen jetzt ist '^' UND ' '

Irgendwelche Ideen?

War es hilfreich?

Lösung

Sie sollten s1.StrictDelimiter := True für Räume festlegen nicht als Trennzeichen zu sein, mehr Infos hier .

Da Sie in einer Version arbeiten, die nicht die oben nicht unterstützt (wie geklärt wurde, nachdem die Antwort eingereicht wurde), haben Sie zwei Möglichkeiten:

  1. Suchen ein Zeichen, das Sie nicht wissen, in dem ursprünglichen Text verwendet wird (zum Beispiel Unterstrich), konvertiert alle Räume dieses Zeichen vor der Spaltung und convert zurück nach der Trennung. Dies ist Robosoft 's Vorschlag.
  2. Wenn Sie Anführungszeichen und Leerzeichen nicht im Text haben, können Sie Alexander 's Trick und Wrap der Text zwischen den Begrenzungszeichen in invertiertem Befehl, damit 'hello hello^bye bye' Windungen '"hello hello"^"bye bye"'. Wenn Sie diesen Pfad zu tun wählen, und es funktioniert für Sie, bitte Alexander Antwort akzeptieren und nicht von mir, er stellt auch den Code, sie umzusetzen.

Die beiden Abhilfen nicht StrictDelimiter mit Einschränkungen haben: das erfordert zunächst einige nicht verwendete Zeichen und die zweite erfordert keine Anführungszeichen und Leerzeichen im Originaltext.

Es ist Zeit, vielleicht auf eine neuere Version von Delphi zu aktualisieren:)

Andere Tipps

sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';

Ryan hat Anbieter eine hervorragende Lösung für dieses Problem mit ExtractStrings () Funktion in Delphi. Siehe auch:

einen String parsen ein Trennzeichen zu einem TStringList verwenden, scheint auf Räume auch Parse zu (Delphi)

So in Ihrem Fall ersetzen Anrufe sl.Delimiter und sl.DelimitedText mit der Zeile unter: ExtractStrings ([ '^'], [], PChar (S), SL);

sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);

Arbeit ist in Delphi 7 "wie Handschuhe" für mich. Dies ist meine Funktion nach Alexander Trick anwenden:

procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings) ;
begin
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText :=  '"' + StringReplace(Input, Delimiter, '"' + Delimiter + '"', [rfReplaceAll]) + '"' ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := 'Users^foo bar^bar foo^foobar^barfoo';
  Split('^',Edit1.Text,Memo1.Lines);
end;

Vielen Dank!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top