58

TStringList クラスの区切り文字に問題があります。見てみましょう:

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]戻る必要があります'foo bar'

sl[1]戻る'foo'

区切り文字が'^'ANDになったようです' '

何か案は?

4

5 に答える 5

90

s1.StrictDelimiter := True区切り文字と見なされないようにスペースを設定する必要があります。詳細はこちらをご覧ください。

上記をサポートしていないバージョンで作業しているため (回答が提出された後に明らかにされたように)、次の 2 つのオプションがあります。

  1. 元のテキストで使用されないことがわかっている文字 (アンダースコアなど) を見つけ、分割する前にすべてのスペースをその文字に変換し、分割後に元に戻します。これはロボソフトの提案です。
  2. テキストに逆コンマとスペースがない場合は、アレクサンダーのトリックを使用して、逆コマンドの区切り文字でテキストを折り返すこと'hello hello^bye bye'ができ'"hello hello"^"bye bye"'ます。このパスを選択してうまくいく場合は、私のものではなくアレクサンダーの答えを受け入れてください。彼はそれを実装するためのコードも提供しています。

を使用しない両方の回避策StrictDelimiterには制限があります。最初の方法では未使用の文字が必要であり、2 番目の方法では元のテキストに逆コンマとスペースが必要ありません。

たぶん、Delphi の新しいバージョンにアップグレードする時が来ました :)

于 2009-08-26T14:25:55.300 に答える
19
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
于 2009-08-26T15:56:17.130 に答える
6

Ryan は、Delphi で ExtractStrings() 関数を使用して、この問題に対する優れたソリューションを提供しています。見る:

TStringList への区切り文字を使用して文字列を解析すると、スペースも解析されるようです (Delphi)

したがって、あなたの場合、sl.Delimiter と sl.DelimitedText の呼び出しを次の行に置き換えます。 ExtractStrings(['^'], [], PChar(S), sl);

于 2013-03-05T13:45:04.267 に答える
2
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
于 2013-05-22T15:31:45.797 に答える