NSORT. Функция "естественной" (как в Windows) сортировки значений списка.

Готовые скрипты, модули расширений, динамические библиотеки и вспомогательные утилиты.
Аватара пользователя
Владимир
Администратор
Сообщения: 614
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

NSORT. Функция "естественной" (как в Windows) сортировки значений списка.

Сообщение Владимир » 23 июл 2019, 19:36

Может использоваться для сортировки списка файлов и каталогов, IP-адресов, результатов, полученных из встроенных и других функций, прочих произвольных списков.

Изображение Изображение
ОписаниеПоказать
Параметры:

1. [текст] Текст с разделитем CR+LF (#13#10, newline - комбинация возврата каретки и символа новой строки.).

Результат:

Отсортированный текст с исходным разделителем.

Пример:

Код: Выделить всё

NSORT(
'Текст 1 
Текст 10
Текст 2
Текст 20
Текст 3
...')
Результат:

Код: Выделить всё

Текст 1
Текст 2
Текст 3
Текст 10
Текст 20
...
Код расширенияПоказать

Код: Выделить всё

{@module
author=Develop-Soft [ https://forum.develop-soft.ru ]
version=2
description=Обработка текста
Функции:
1. NSORT - функция сортировки значений списка.

Изменения:
v 0.1 от 23.07.2019 - выход первой версии
v 2 от 24.07.2019 - оптимизирован и значительно ускорен алгоритм сортировки.
...
@}


{@function
OrigName=NSORT
Name=NSORT
Args=v
Result=s
Group=Текст
Description=
<b><font color="#0000A0">Функция "естественной" (как в Windows) сортировки
значений списка.</b><p>
Может использоваться для списка файлов и каталогов, IP-адресов, результатов,
полученных из встроенных и других функций, прочих произвольных списков.<p>
<p><b>Параметры:</b><p>
1. <i>[текст]</i> Текст с разделитем CR+LF <i>(#13#10, newline - комбинация
возврата каретки и символа новой строки.)</i>.<p>
<b>Результат:</b><p> Отсортированный текст с исходным разделителем. <p>
<b>Пример:</b><p><code><b>NSORT(</b><font color="#008040"><br>'Текст 1
<br>Текст 10<br>Текст 2<br>Текст 20<br>Текст 3<br>...'</font><b>)</b></code><p>
<b>Результат:</b><p><code>Текст 1<br>Текст 2<br>Текст 3<br>Текст 10<br>
Текст 20<br>...</code>
@}


function StrCmpLogical(S1,S2:WideString):integer;
external 'StrCmpLogicalW@shlwapi.dll stdcall';

function TVCMP(Node1, Node2: TTreeNode): integer;
begin
  Result := StrCmpLogical(Node1.Text, Node2.Text);
end;

function NSort(InStr:variant):string;
var
  tv :TTreeView;
  InSS,OutSS:TStringStream;
begin
if (Trim(VarToStr(InStr))='') {or (Utf8Pos(#13#10,VarToStr(InStr),1)=0)} then exit;
  try
    InSS := TStringStream.Create(VarToStr(InStr));
    tv := TTreeView.Create(nil);
    tv.LoadFromStream(InSS);
    InSS.Free;
    InSS:=nil;
    tv.CustomSort(@TVCMP);
    OutSS := TStringStream.Create('');
    tv.SaveToStream(OutSS);
    result:=OutSS.DataString;
    OutSS.Free;
    OutSS:=nil;
  finally
     tv.Free;
     tv := nil;
  end;
end;

демо

Скачать:
NSort_v2.epas
(2.35 КБ) 130 скачиваний

Поддержка проекта

Теги:

Аватара пользователя
Владимир
Администратор
Сообщения: 614
Зарегистрирован: 10 фев 2018, 18:27
Откуда: Белгород
Контактная информация:

NSORT. Функция "естественной" (как в Windows) сортировки значений списка.

Сообщение Владимир » 24 июл 2019, 12:32

Обновление (v2.):
Ускорена работа функции.

Ответить