View previous topic :: View next topic |
Author |
Message |
WindR
Joined: 21 Dec 2019 Posts: 35
|
(Separately) Posted: Sun Jun 07, 2020 20:21 Post subject: Натуральная сортировка |
|
|
Обращаюсь к знатокам VBS.
Возможно ли реализовать натуральную сортировку в скрипте, идущем с beyond compare?
На данный момент он сортирует так: 1, 11...19, 2..29, 3 и т.д. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Mon Jun 08, 2020 00:41 Post subject: |
|
|
WindR
Одни числа сортировать — не проблема: Code: | Numbers = "12 1 1,1 14 11 2 21 22 2.1 2.2 15 1,5"
Set Col = CreateObject("System.Collections.ArrayList")
D = Mid(1/2,2,1)
Numbers = Replace(Replace(Numbers, ".", D), ",", D)
For Each N in Split(Numbers)
Col.Add CSng(N)
Next
Col.Sort
MsgBox Join(Col.ToArray, vbLf)
Set Col = Nothing |
А вот текст вперемешку с цифрами — это уже совсем другая песня. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
WindR
Joined: 21 Dec 2019 Posts: 35
|
(Separately) Posted: Tue Jun 09, 2020 18:21 Post subject: |
|
|
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 |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Jun 10, 2020 03:02 Post subject: |
|
|
WindR
Распаковывать zip-ы я умею.
Вот прямо сейчас ковырять код под эту прогу нет ни времени, ни желания. Но для прогресса советую описать в подробностях поведение в программе со скриншотами и отметками на них. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
WindR
Joined: 21 Dec 2019 Posts: 35
|
(Separately) Posted: Thu Jun 11, 2020 09:45 Post subject: |
|
|
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 |
|
|
|
|
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
|