Дельфы:Разделитель StringList всегда является символом пробела, даже если задан разделитель

StackOverflow https://stackoverflow.com/questions/1335027

Вопрос

У меня возникли проблемы с разделителем в классе 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 чтобы пробелы не считались разделителями, дополнительная информация здесь.

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

  1. Найдите символ, который, как вы знаете, не будет использоваться в исходном тексте (напримерподчеркивание), преобразуйте все пробелы в этот символ перед разделением и преобразуйте обратно после разделения.Это робософтэто предложение.
  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.Delimiter и sl.DelimitedText на строку ниже:Извлекающие нити(['^'], [], PChar(Ы), 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;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top