デルフィ:StringList の区切り文字は、区切り文字が設定されている場合でも常に空白文字です
-
20-09-2019 - |
質問
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'
区切りは今のようです '^'
そして ' '
何か案は?
解決
設定する必要があります s1.StrictDelimiter := True
区切り文字としてみなされないスペースについては、詳細をご覧ください。 ここ.
上記をサポートしていないバージョンで作業しているため (回答の送信後に明らかになったように)、次の 2 つのオプションがあります。
- 元のテキストでは使用されないとわかっている文字を見つけます (例:アンダースコア)、分割前にすべてのスペースをその文字に変換し、分割後に元に戻します。これは ロボソフトさんの提案。
- テキストに逆カンマやスペースがない場合は、次のようにすることができます。 アレクサンダーのトリックと反転コマンドの区切り文字の間にテキストをラップすることで、
'hello hello^bye bye'
に変わります'"hello hello"^"bye bye"'
. 。このパスを選択してうまくいく場合は、私の答えではなく、Alexander の答えを受け入れてください。彼はそれを実装するコードも提供しています。
どちらの回避策も使用しない StrictDelimiter
制限があります:1 つ目は未使用の文字を必要とし、2 つ目は元のテキストに逆カンマやスペースを必要としません。
Delphi の新しいバージョンにアップグレードする時期が来たのかもしれません :)
他のヒント
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
ライアンは、プロバイダにDelphiでExtractStrings()関数を使用して、この問題に対する優れた解決策を持っています。参照してください。
<のhref = "https://stackoverflow.com/questions/3063930/parsing-a-string-using-a-delimiter-to-a-tstringlist-seems-to-also-parse-on-spac" >また、スペース(デルファイ)で解析すると思われる、TStringListのに区切り文字を使用して文字列を解析する
あなたの場合には、以下の行でsl.Delimiterとsl.DelimitedTextへの呼び出しを置き換えるので: のExtractStrings([ '^']、[]、PChar型(S)、SL); の
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
仕事のデルファイ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;
どうもありがとうございました!