Delphi: Stringtrennzeichen ist immer ein Leerzeichen, auch wenn Delimiter Satz ist
-
20-09-2019 - |
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?
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:
- 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.
- 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:
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!