Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Поиск удобной программы для сравнения файлов
Goto page Previous  1, 2, 3, 4
 
Post new topic   Reply to topic    Total Commander Forum Index -> Программное обеспечение printer-friendly view
View previous topic :: View next topic  
Author Message
WindR



Joined: 21 Dec 2019
Posts: 35

Post (Separately) Posted: Sun Jun 07, 2020 20:21    Post subject: Натуральная сортировка Reply with quote

Обращаюсь к знатокам VBS.
Возможно ли реализовать натуральную сортировку в скрипте, идущем с beyond compare?
На данный момент он сортирует так: 1, 11...19, 2..29, 3 и т.д.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Mon Jun 08, 2020 00:41    Post subject: Reply with quote

WindR
 Одни числа сортировать — не проблема:
А вот текст вперемешку с цифрами — это уже совсем другая песня.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
WindR



Joined: 21 Dec 2019
Posts: 35

Post (Separately) Posted: Tue Jun 09, 2020 18:21    Post subject: Reply with quote

Flasher
Нужно модифицировать
Code:
' INI_sorted.vbs
'
' Sorts .INI files.
' Usage:
'  WScript INI_sorted.vbs <input file> <output file>
'
' Notes:
'  Handles Unicode or ASCII encodings
'  Handles line continuations ('\' at end of line)
'  Blank grouped with next
'  Comment grouped with previous

Option Explicit

' OpenTextFile format
Const TristateTrue = -1
Const TristateFalse = 0
' OpenTextFile iomode
Const ForReading = 1

Dim FileSys
Set FileSys = CreateObject("Scripting.FileSystemObject")
If FileSys.FileExists(WScript.Arguments(1)) Then
   FileSys.DeleteFile WScript.Arguments(1)
End If
' Calculate codepage (Unicode or ASCII)
Dim CodePage, SrcFile
Set SrcFile = FileSys.OpenTextFile(WScript.Arguments(0), ForReading, False, TristateFalse)
If Left(SrcFile.ReadLine, 2) = Chr(255) & Chr(254) Then
   CodePage = TristateTrue
Else
   CodePage = TristateFalse
End If
SrcFile.Close
' Load lines
Dim BOM, HasBOM, I, Lines()
BOM = Chr(239) & Chr(187) & Chr(191)
HasBOM = 0
Set SrcFile = FileSys.OpenTextFile(WScript.Arguments(0), ForReading, False, CodePage)
I = 0
Do While Not SrcFile.AtEndOfStream
   ReDim Preserve Lines(I)
   Lines(I) = SrcFile.ReadLine
   If (I = 0) and (Left(Lines(I), Len(BOM)) = BOM) Then
      HasBOM = 1
      Lines(I) = Right(Lines(I), Len(Lines(I)) - Len(BOM))
   End If
   I = I + 1
Loop
SrcFile.Close
' Calculate ids
Dim Blank, Continued, IDs(), J, PropName, S, SectName, SList
Blank = True
Continued = False
ReDim IDs(UBound(Lines))
PropName = Chr(0)
SectName = Chr(0)
For I = 0 To UBound(Lines)
   S = Trim(Lines(I))
   If S = "" Then ' Blank
      Blank = True
      Continued = False
   ElseIf Continued Then ' Continuation of previous
      If Right(S, 1) <> "\" Then
         Continued = False
      End If
   ElseIf Left(S, 1) = ";" Then ' Comment
   ElseIf Left(S, 1) = "[" Then ' Section
      Blank = False
      PropName = Chr(0)
      SList = Split(S, "]", -1, vbTextCompare)
      If IsArray(SList) Then
         SectName = Mid(SList(0), 2)
      Else
         SectName = Mid(S, 2)
      End If
      If SectName = "" Then
         SectName = Chr(0)
      End If
   Else ' Property
      Blank = False
      If Right(S, 1) = "\" Then
         S = Left(S, Len(S) - 1)
         Continued = True
      End If
      SList = Split(S, "=", -1, vbTextCompare)
      If IsArray(SList) Then
         PropName = SList(0)
      Else
         PropName = S
      End If
      If PropName = "" Then
         PropName = Chr(0)
      End If
   End If
   If Blank Then
      S = ""
   Else
      S = SectName & vbTab & PropName
   End If
   IDs(I) = S
   If (S <> "") And (I > 0) Then
      J = I - 1
      Do While (IDs(J) = "")
         IDs(J) = S
         If J = 0 Then
            Exit Do
         End If
         J = J - 1
      Loop
   End If
Next
For I = 0 To UBound(Lines)
   If IDs(I) = "" Then
      IDs(I) = vbTab
   End If
   IDs(I) = IDs(I) & vbTab & Right("0000000000" & I, 10)
Next
' Sort
QuickSort 0, UBound(Lines)
' Save
Dim TgtFile
Set TgtFile = FileSys.CreateTextFile(WScript.Arguments(1), True, CodePage = TristateTrue)
If HasBOM <> 0 Then
   Lines(0) = BOM & Lines(0)
End If
For I = 0 To UBound(Lines)
   TgtFile.WriteLine Lines(I)
Next
TgtFile.Close

Sub QuickSort(Lo, Hi)
   Dim I, J, P, T
   Do
      I = Lo
      J = Hi
      P = Int((Lo + Hi) / 2)
      Do
         Do While IDs(P) > IDs(I)
            I = I + 1
         Loop
         Do While IDs(J) > IDs(P)
            J = J - 1
         Loop
         If I > J Then
            Exit Do
         End If
         T = IDs(I)
         IDs(I) = IDs(J)
         IDs(J) = T
         T = Lines(I)
         Lines(I) = Lines(J)
         Lines(J) = T
         If P = I Then
            P = J
         ElseIf P = J Then
            P = I
         End If
         I = I + 1
         J = J - 1
      Loop While (I <= J)
   If Lo < J Then
      QuickSort Lo, J
   End If
   Lo = I
   If I >= Hi Then
      Exit Do
   End If
   Loop
End Sub

чтобы он сортировал строки просто отбросив нечисловые знаки до первого вхождения числа.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Wed Jun 10, 2020 03:02    Post subject: Reply with quote

WindR
Распаковывать zip-ы я умею. Wink
Вот прямо сейчас ковырять код под эту прогу нет ни времени, ни желания. Но для прогресса советую описать в подробностях поведение в программе со скриншотами и отметками на них.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
WindR



Joined: 21 Dec 2019
Posts: 35

Post (Separately) Posted: Thu Jun 11, 2020 09:45    Post subject: Reply with quote

Flasher
Есть bar-файл Total Commander. Несортированный он выглядит так
Code:
[Buttonbar]
Buttoncount=16
button1=%commander_path%\Install\Icons\w-b\2.icl32,1
iconic1=
iconic6=0
iconic7=1
iconic8=0
button9=%P%\DrWeb\ico\2.icl
cmd9=%R%
path9=%P%\DrWeb\
menu9=Dr.Web 6 Portable Scanner - лечащий антивирусный сканер|Клик с Ctrl обновит программу|Клик с Shift проверит файл/папку под курсором
button10=%I%,220
cmd10=%R%
path10=%P%\uVS\
iconic10=0
menu10=uVS - борьба с неизвестными вирусами. Отлично справляется с Winlock. Восстановление ОС. Умеет работать с неактивной ОС|Клик с Ctrl обновит программу
button11=%I%,279
cmd11=%R%
path11=%P%\avz4\
iconic11=0
menu11=AVZ - борьба с SpyWare, AdWare, Dialer, BackDoor, Trojan + очень полезная система исследования и восстановления Windows|Клик с Ctrl обновит программу
button12=%P%\AdwCleaner\ico\2.ico
cmd12=%R%
menu12=AdwCleaner - поможет найти рекламное и потенциально опасное ПО|Клик с Ctrl обновит программу
path12=%P%\AdwCleaner\
cmd1=%P%\ButtonBar\ButtonBar eXtended.exe
param1=em_bar1>1
path1=%commander_path%\install\Bars\
menu1=Команды, Архиваторы, Работа с файлами (клик с Ctrl сделает панель по-умолчанию) (Alt+1)
button13=%I%,159
cmd13=%P%\AnVir\VirusTotalUpload.exe
menu13=Virus Total Upload - отправить файл на сайт VirusTotal.com, там его проверят более 60 антивирусов. Можно перетащить файл на кнопку
path13=%P%\AnVir\
iconic13=0
...

INI_sorted.vbs превращает его в
Code:
[Buttonbar]
Buttoncount=16
button1=%commander_path%\Install\Icons\w-b\2.icl32,1
button10=%I%,220
button11=%I%,279
button12=%P%\AdwCleaner\ico\2.ico
button13=%I%,159
button2=%commander_path%\Install\Icons\w-b\2.icl32,3
button3=%commander_path%\Install\Icons\w-b\2.icl32,5
button4=%commander_path%\Install\Icons\w-b\2.icl32,7
button5=%commander_path%\Install\Icons\w-b\2.icl32,9
button7=%commander_path%\Install\Icons\w-b\2.icl32,12
button9=%P%\DrWeb\ico\2.icl
cmd10=%R%
cmd11=%R%
cmd12=%R%
cmd13=%P%\AnVir\VirusTotalUpload.exe
cmd14=%P%\USBVaccine\USBVaccine.exe
cmd15=%P%\TrueCrypt\TrueCrypt.exe
cmd16=%R%
cmd2=%P%\ButtonBar\ButtonBar eXtended.exe
cmd3=%P%\ButtonBar\ButtonBar eXtended.exe
cmd4=%P%\ButtonBar\ButtonBar eXtended.exe
cmd5=%P%\ButtonBar\ButtonBar eXtended.exe
cmd7=%COMMANDER_PATH%\install\Bars\favorit\favorit.bar
cmd9=%R%
iconic1=
iconic6=0
iconic7=1
iconic8=0
menu10=uVS - борьба с неизвестными вирусами. Отлично справляется с Winlock. Восстановление ОС. Умеет работать с неактивной ОС|Клик с Ctrl обновит программу
menu11=AVZ - борьба с SpyWare, AdWare, Dialer, BackDoor, Trojan + очень полезная система исследования и восстановления Windows|Клик с Ctrl обновит программу
menu12=AdwCleaner - поможет найти рекламное и потенциально опасное ПО|Клик с Ctrl обновит программу
menu13=Virus Total Upload - отправить файл на сайт VirusTotal.com, там его проверят более 60 антивирусов. Можно перетащить файл на кнопку
menu14=USB Vaccine - защита флешки от вирусов с автозапуском, методом записи на флеш неудаляемых файлов
menu15=TrueCrypt - создаёт зашифрованный том-контейнер (выглядит как обычный файл mp3, avi и тд), который затем можно подключить в виде диска и хранить на нём информацию
menu16=KeePass Password Safe 2.xx - надёжное хранение паролей. Генератор паролей. Требуется .NET|Клик с Ctrl обновит программу
menu2=Программы и Утилиты (клик с Ctrl сделает панель по-умолчанию) (Alt+2)
menu3=Интернет и Сети (клик с Ctrl сделает панель по-умолчанию) (Alt+3)
menu4=Настройка, Оптимизация, Восстановление, Антивирусы (клик с Ctrl сделает панель по-умолчанию) (Alt+4)
menu5=Пользовательская панель (клик с Ctrl сделает панель по-умолчанию) (Alt+5)
menu7=Задачи
param1=em_bar1>1
param10=-c _update.bat -e _update.bat -u -r start.exe
param11=-c _update.bat -e _update.bat -u -r avz4\avz.exe
param12=-c _update.bat -e _update.bat -u -r *.exe
param2=em_bar2>1
param3=em_bar3>1
param4=em_bar4>1
param5=em_bar0>1
param9=-s drweb\drweb32w.exe --sp="%P%N /NI /ML /AR /HA /OK /UPN /TM- /AL /SS- /SD /SHELL /TB- /NR" -c _update.bat -e _update.bat -u -r drweb\drweb32w.exe --rp="/not_use_shield"
path1=%commander_path%\install\Bars\
menu1=Команды, Архиваторы, Работа с файлами (клик с Ctrl сделает панель по-умолчанию) (Alt+1)
path10=%P%\uVS\
iconic10=0
path11=%P%\avz4\
iconic11=0
path12=%P%\AdwCleaner\
cmd1=%P%\ButtonBar\ButtonBar eXtended.exe
path13=%P%\AnVir\
iconic13=0
...

Нужно внутри секций [.........] сортировать строки натурально по первому встречающемуся в строке числу.
Сейчас для этих целей приходится использовать SortLines.js от KDJ, что неудобно, т.к. требует установки интерпретатора JS.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Программное обеспечение All times are GMT + 4 Hours
Goto page Previous  1, 2, 3, 4
Page 4 of 4

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group