web-dev-qa-db-ja.com

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 ' 'になったようです

何か案は?

54
Acron

区切り文字と見なされないスペースにはs1.StrictDelimiter := Trueを設定する必要があります。詳細は here を参照してください。

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

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

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

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

83
Roee Adler
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
18
Alex

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

TStringListの区切り文字を使用して文字列を解析します。スペースでも解析するようです(Delphi)

したがって、あなたの場合、sl.Delimiterとsl.DelimitedTextの呼び出しを以下の行に置き換えてください:ExtractStrings(['^']、[]、PChar(S)、sl);

4
Kashif Raja
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
2
barbaris

仕事は私にとって「手袋のような」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;

どうもありがとう!

2
Ale Costa