RemoveCrLfTabDSpace
Для упрощения разбора текста бывает полезно удалить из него
разделители. Функция
RemoveCrLfTabDSpace
удаляет символы
Cr=#13, Lf=#10,
Tab=#9
, двойные пробелы, и вообще все невидимые символы
с кодом меньше, чем у пробела. Такие же символы на концах строки
удаляет стандартная функция
Trim
function RemoveCrLfTabDSpace(Source: WideString):
WideString;
var p: integer; Res: WideString; C: WideChar;
begin
Res := '';
for p := 1 to Length(Source) do
begin
C := Source[p];
if C < Space then C := Space; //Space =
#32
if (p = 1) then
Res := Res + C
else
if Res[Length(Res)] <> Space then
Res := Res + C
else
if C <> Space then
Res := Res + C;
end;
{result}RemoveCrLfTabDSpace := Res;
end;
Эта функция иногда называется
TrimAll
. Кажется, что алгоритм достаточно оптимальный, но всё
же его можно ускорить для большого текста с большим числом разделителей.
Метод ускорения описан на примере функции
ReplaceStr
где используется класс
TWideString
. Более быстрая функция
RemoveCrLfTabDSpace
выглядит так:
function RemoveCrLfTabDSpace(Source: WideString):
WideString;
var p: integer; Res: TWideString; C: WideChar;
begin
Res := TWideString.Create;
for p := 1 to Length(Source) do
begin
C := Source[p];
if C < Space then C := Space;
if (p = 1) then
Res.Append(C)
else
if Res[Length(Res)] <> Space then
Res.Append(C)
else
if C <> Space then
Res.Append(C);
end;
{result}RemoveCrLfTabDSpace := Res.Text;
Res.Destroy;
end;
По сравнению с обычным использованием строки
WideString
из Delphi 7 алгоритм с использованием
TWideString
может работать в сто
раз быстрее. Пример есть на страничке
ReplaceStr.