Delphi: разделитель StringList всегда является пробелом, даже если разделитель установлен


у меня возникли проблемы с разделителем в классе 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'

кажется, что разделитель теперь '^' и ' '

какие идеи?

5   51   2009-08-26 18:16:08

5 ответов:

вы должны установить s1.StrictDelimiter := True чтобы пробелы не считались разделителями, дополнительная информация здесь.

так как вы работаете в версии, которая не поддерживает выше (как было выяснено после того, как был представлен ответ), у вас есть два варианта:

  1. найдите символ, который, как вы знаете, не будет использоваться в исходном тексте (например, подчеркивание), преобразуйте все пробелы в этот символ перед разделением и преобразуйте обратно после разделения. Это robosoft ' s предложение.
  2. если у вас нет кавычек и пробелов в тексте, вы можете использовать Александрхитрость и обернуть текст между разделителями в перевернутой команде, так что 'hello hello^bye bye' превращается в '"hello hello"^"bye bye"'. Если вы выбрали этот путь, и он работает для вас, пожалуйста, примите ответ Александра, а не мой, он также предоставляет код для его реализации.

оба обходных пути не используют StrictDelimiter есть ограничения: первый требует некоторого неиспользуемого символа, а второй во-вторых, не требует кавычек и пробелов в исходном тексте.

может быть, пришло время перейти на более новую версию Delphi :)

sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';

У Райана есть отличное решение этой проблемы с помощью функции ExtractStrings () в Delphi. Смотрите:

разбор строки с помощью разделителя в TStringList, кажется, также разбор на пробелы (Delphi)

поэтому в вашем случае замените вызовы на sl.Разделитель и сл.DelimitedText со строкой ниже: Экстракционные нити(['^'], [], 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;

Спасибо большое!