Добавьте более 1 разделителя в TStringList - PullRequest
5 голосов
/ 27 февраля 2012

Это мой текст с разделителями: $ HEHDT, 10,17, T * 28 $ HEHDT, 10,18, T * 2A и так далее ...

Запятая - это мой разделитель предложений. Тем не менее, я хочу использовать звездочку в качестве разделителя.

Вывод, который я хочу достичь:

$ HEHDT 10,17 T 28 $ HEHDT 10,18 T 2A * +1007 *

Как мне указать более 1 разделителя предложений в delphi? Это код, который я до сих пор.

var
  MyStringList: TStringList;
  i: Integer;
begin
  MyStringList:= TStringList.Create;

  MyStringList.Delimiter := ','
  MyStringList.DelimitedText := '$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A' +#13#10;

  for i= 0 to MyStringList.Count-1 do
    ShowMessage(MyStringList[i]);

  MyStringList.Free;
end;

Для приведенного выше кода в качестве разделителя используется только запятая. Как включить 2 разделителя, запятую и звездочку?

Большое спасибо заранее! =)

Ответы [ 4 ]

7 голосов
/ 27 февраля 2012

Delphi stringlist достаточно хорош, чтобы дать вам возможность анализировать текст по одному разделителю «бесплатно».Если вы хотите установить разделителей - тогда вам нужно использовать StrUtils.SplitString:

http://docwiki.embarcadero.com/VCL/en/StrUtils.SplitString

0 голосов
/ 27 февраля 2012

Вы можете использовать два списка строк, один используя запятую, другой используя звездочку в качестве разделителя.Затем присвойте свойство text первого свойства text с разделителями второго.

0 голосов
/ 27 февраля 2012
  1. Краткий ответ - НЕТ.
  2. Но вы можете использовать собственный TStringList.

TStringList принимает один и только один разделитель.

Выдержка из справки Embarcadero RAD Studio:

Classes.TStrings.DelimitedText

Описание

Представляет все строки в объекте TStrings как одиночный строка с разделителями.

Используйте DelimitedText, чтобы получить или установить все строки в объекте TStrings в одну строку, разделенные символом , указанным в свойстве Delimiter.


Чтобы иметь возможность использовать более чем одного Delimiters, вы должны "расширить" возможности класса TStringList, создав из него новый класс.

Вы можете найти здесь пример исходного кода класса TStringListEx , имеющего аналогичное поведение, которое вы можете легко адаптировать к вашим требованиям.

Выдержка

TStringListEx = class(TStringList)
private
  FDelimiter: String;
  function GetDelimitedText: String;
  procedure SetDelimitedText(const Value: String);
published
  property Delimiter: String read FDelimiter write FDelimiter;
  property DelimitedText: String read GetDelimitedText write SetDelimitedText;
end;

обходной путь , состоящий из предварительной обработки строки для установки в свойство TStringList.DelimitedText с остальными разделителями (первый из которых устанавливается в свойство TStringList.Delimeter) может достичь вашей цели, кроме решений, указанных в сообщениях paulsm4 и Роберт Фрэнк, вы также можете использовать Регулярное выражение .

0 голосов
/ 27 февраля 2012

Вы можете использовать ReplaceString, заменяя все звездочки на запятые.Измените строку назначения следующим образом:

 String.DelimitedText := ReplaceString('$HEHDT,10.17,T*28'+#13#10 +'$HEHDT,10.18,T*2A', '*',
                         ',', [rfReplaceAll]);

Ваш приведенный выше код должен затем работать.

Примечание: свойство DelimitedText, я полагаю, также рассматривает пробелы как разделители.Так что если в строке есть пробелы, ваш код может не работать так, как вы ожидаете ...

...