Delphi:TStringList Delimiterは、Delimiterが設定されていても常にスペース文字です
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 ' '
になったようです
何か案は?
区切り文字と見なされないスペースにはs1.StrictDelimiter := True
を設定する必要があります。詳細は here を参照してください。
上記をサポートしていないバージョンで作業しているため(回答の送信後に明らかになったように)、次の2つのオプションがあります。
- 元のテキストで使用されないことがわかっている文字(アンダースコアなど)を見つけ、分割する前にすべてのスペースをその文字に変換し、分割後に元に戻します。これは robosoft の提案です。
- テキストにコンマとスペースが逆になっていない場合、 Alexander のトリックを使用して、逆コマンドで区切り文字の間にテキストをラップして、
'hello hello^bye bye'
が'"hello hello"^"bye bye"'
。このパスを選択しても機能する場合は、私のものではなくアレキサンダーの答えを受け入れてください。彼はそれを実装するコードも提供します。
StrictDelimiter
を使用しない両方の回避策には制限があります。1つ目は未使用の文字を必要とし、2つ目は元のテキストにコンマとスペースを逆にする必要がありません。
Delphiの新しいバージョンにアップグレードする時が来たのかもしれません:)
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
Ryanは、DelphiのExtractStrings()関数を使用して、この問題に対する優れたソリューションを提供しています。見る:
TStringListの区切り文字を使用して文字列を解析します。スペースでも解析するようです(Delphi)
したがって、あなたの場合、sl.Delimiterとsl.DelimitedTextの呼び出しを以下の行に置き換えてください:ExtractStrings(['^']、[]、PChar(S)、sl);
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
仕事は私にとって「手袋のような」Delphi 7にあります。これはアレクサンダーのトリックを適用した後の私の機能です:
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;
どうもありがとう!