Поиск удобной программы для сравнения файлов
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3, 4  :| |:
Total Commander -> Программное обеспечение

#46: Натуральная сортировка Author: WindRLocation: Москва PostPosted: Sun Jun 07, 2020 20:21
    —
Обращаюсь к знатокам VBS.
Возможно ли реализовать натуральную сортировку в скрипте, идущем с beyond compare?
На данный момент он сортирует так: 1, 11...19, 2..29, 3 и т.д.

#47:  Author: FlasherLocation: Москва PostPosted: Mon Jun 08, 2020 00:41
    —
WindR
 Одни числа сортировать — не проблема:
А вот текст вперемешку с цифрами — это уже совсем другая песня.

#48:  Author: WindRLocation: Москва PostPosted: Tue Jun 09, 2020 18:21
    —
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

чтобы он сортировал строки просто отбросив нечисловые знаки до первого вхождения числа.

#49:  Author: FlasherLocation: Москва PostPosted: Wed Jun 10, 2020 03:02
    —
WindR
Распаковывать zip-ы я умею. Wink
Вот прямо сейчас ковырять код под эту прогу нет ни времени, ни желания. Но для прогресса советую описать в подробностях поведение в программе со скриншотами и отметками на них.

#50:  Author: WindRLocation: Москва PostPosted: Thu Jun 11, 2020 09:45
    —
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.



Total Commander -> Программное обеспечение


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2, 3, 4  :| |:
Page 4 of 4

Powered by phpBB © 2001, 2005 phpBB Group