Delphi: StringList Delimiter всегда является пробелом, даже если установлен Delimiter - PullRequest
52 голосов
/ 26 августа 2009

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

82 голосов
/ 26 августа 2009

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

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

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

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

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

18 голосов
/ 26 августа 2009
sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';
4 голосов
/ 05 марта 2013

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

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

Так что в вашем случае замените вызовы sl.Delimiter и sl.DelimitedText на строку ниже: ExtractStrings (['^'], [], PChar (S), sl);

2 голосов
/ 29 октября 2013

Работа в 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 голосов
/ 22 мая 2013
sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);
...