Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Подсчет количества одинаковых символов в txt файле (http://forum.oszone.net/showthread.php?t=330515)

ia_del@vk 15-10-2017 08:39 2770676

Подсчет количества одинаковых символов в txt файле
 
Доброго времени суток. Прошу помощи в написании bat файла, который будет выявлять общее количество одинаковых символов в txt файле,с выводом количества совпадений по "N"символу.

Iska 15-10-2017 09:32 2770681

ia_del@vk, пакетные файлы для сего не очень годятся. Я буквально на днях приводил коллеге blackeangel гипотетический пример реализации на WSH, но по другому поводу. В Вашем случае сие может выглядеть так (с добавлением чтения из файла):
Скрытый текст
Код:

Option Explicit

Dim strSourceFile

Dim objFSO

Dim strContent
Dim i
Dim strSymbol
Dim strKey


If WScript.Arguments.Count = 1 Then
        strSourceFile = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FileExists(strSourceFile) Then
                With objFSO.OpenTextFile(strSourceFile)
                        strContent = Replace(.ReadAll(), vbCrLf, "")
                        .Close
                End With
               
                With WScript.CreateObject("Scripting.Dictionary")
                        For i = 1 To Len(strContent)
                                strSymbol = Mid(strContent, i, 1)
                               
                                If Not .Exists(strSymbol) Then
                                        .Add strSymbol, 1
                                Else
                                        .Item(strSymbol) = .Item(strSymbol) + 1
                                End If
                        Next
                       
                        WScript.Echo "Symbol", vbTab, "Count"
                        WScript.Echo "======", vbTab, "====="
                       
                        For Each strKey In .Keys
                                WScript.Echo strKey, vbTab, .Item(strKey)
                        Next
                       
                        .RemoveAll
                End With
        Else
                WScript.Echo "Can't find source file [" & strSourceFile & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0


Путь к исходному файлу задаётся параметром скрипта. Символы конца строки «0x0D, 0x0A» из подсчёта убраны.

ia_del@vk 15-10-2017 14:00 2770730

Цитата:

Цитата Iska
ia_del@vk, пакетные файлы для сего не очень годятся. Я буквально на днях приводил коллеге blackeangel гипотетический пример реализации на WSH, но по другому поводу. В Вашем случае сие может выглядеть так (с добавлением чтения из файла):
Скрытый текст
Путь к исходному файлу задаётся параметром скрипта. Символы конца строки «0x0D, 0x0A» из подсчёта убраны. »

Работает на ура.можно ли добавить словарь "кастомных" символов?

Iska 15-10-2017 14:23 2770735

Цитата:

Цитата ia_del@vk
можно ли добавить словарь "кастомных" символов? »

Что это значит? Поясните.

Скрипт перебирает содержимое файла по одному символу и считает их количество (за вычетом символов конца строки). Вы хотите, чтобы некоторые символы были исключены из подсчёта, так?

megaloman 15-10-2017 18:43 2770797

Цитата:

Цитата Iska
Скрипт перебирает содержимое файла по одному символу и считает их количество (за вычетом символов конца строки). »

Набрался наглости извратить скрипт, чтобы предложить немного другой способ подсчета. Не знаю, что быстре, да и, наверное, это несущественно. Добавил отображение кода символа в выводе.
Код:

Option Explicit

Dim strSourceFile

Dim objFSO

Dim strContent
Dim i
Dim nn
Dim strSymbol
Dim strRezult
Dim strOne

If WScript.Arguments.Count = 1 Then
        strSourceFile = WScript.Arguments.Item(0)
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FileExists(strSourceFile) Then
                With objFSO.OpenTextFile(strSourceFile)
                        strContent = Replace(.ReadAll(), vbCrLf, "")
                        .Close
                End With
               
                nn = Len(strContent)
                strRezult = ""
                Do While nn > 0
                            strOne = Mid(strContent, 1, 1)
                            strContent = Replace(strContent, strOne, "")
                            i = Len(strContent)
                            strRezult = strRezult + strOne + vbTab + CStr(Asc(strOne)) + vbTab + CStr(nn - i)
                        If i<> 0 Then strRezult = strRezult + vbcrlf
                            nn = i
                Loop
                       
                WScript.Echo "Symbol" + vbTab + "Code" + vbTab + "Count"
                WScript.Echo "======" + vbTab + "====" + vbTab + "====="
                WScript.Echo strRezult
        Else
                WScript.Echo "Can't find source file [" & strSourceFile & "]."
                WScript.Quit 2
        End If
       
        Set objFSO = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0

Не вижу особого смысла в задаче, разве что учебный. А по делу неплохо бы еще отсортировать вывод в порядке следования кодов символов.

Iska 15-10-2017 19:42 2770806

megaloman, хе-хе, интересная задумка с Replace'ом :).

megaloman 16-10-2017 21:55 2771067

Вот симбиоз батника и js-скрипта. Сохранить файл с расширением .bat, имя обрабатываемого файла передайте в аргументе, на выходе - текстовый файл с протоколом работы
Код:

@set @E=1; /*

@Echo Off
If "%~1"=="" (
        Cls
        Echo Не указано имя входного файла
        Echo:
        Pause
        GoTo :Eof
)

cscript //NoLogo /E:jscript "%~dpnx0" "%~1" >"%~dpnx0.txt"
GoTo :Eof

*/
var oArg=WScript.Arguments;
if (oArg.Count()>0) {
        var FileTxt,Txt,err;
        var FileTxt=oArg(0);
        var FSO=WScript.CreateObject("Scripting.FileSystemObject");
        try {Txt=FSO.OpenTextFile(FileTxt);}
        catch (err) {
                if (err != 0) {
                        WScript.Echo("Open file "+FileTxt+"\nerror: "+err.number+"\n"+err.description);
                        WScript.Quit();
                }
        }
        var strContent = Txt.ReadAll().replace(/\r|\n/g, '');
        Txt.Close();
        var str1,i;
        var nn=strContent.length;
        WScript.Echo('Symbol\tCount\n======\t=====');
        while (nn>0) {
                str1=strContent.substr(0,1);
                strContent=strContent.replace(new RegExp('['+str1+']','g'),"");
                i=strContent.length;
                WScript.Echo(str1,'\t',(nn-i));
                nn=i;       
        }
}
else {WScript.Echo('using script \n================= \n\n'+'cscript.exe //nologo "scriptname.js" "input text" >"outputfile.txt"');}


Iska 16-10-2017 22:23 2771087

Цитата:

Цитата megaloman
var strContent = Txt.ReadAll().replace(/\r|\n/g, ''); »

Код:

/[\r\n]/g
— не? Альтернатива тоже работает, но, насколько я понимаю, в большее число подстановок.


Время: 14:20.

Время: 14:20.
© OSzone.net 2001-