Войти

Показать полную графическую версию : Подсчет количества одинаковых символов в txt файле


ia_del@vk
15-10-2017, 08:39
Доброго времени суток. Прошу помощи в написании bat файла, который будет выявлять общее количество одинаковых символов в txt файле,с выводом количества совпадений по "N"символу.

Iska
15-10-2017, 09:32
ia_del@vk, пакетные файлы для сего не очень годятся. Я буквально на днях приводил коллеге blackeangel гипотетический пример реализации на WSH (http://forum.oszone.net/post-2770233.html#post2770233), но по другому поводу. В Вашем случае сие может выглядеть так (с добавлением чтения из файла):
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
ia_del@vk, пакетные файлы для сего не очень годятся. Я буквально на днях приводил коллеге blackeangel гипотетический пример реализации на WSH, но по другому поводу. В Вашем случае сие может выглядеть так (с добавлением чтения из файла):
Скрытый текст
Путь к исходному файлу задаётся параметром скрипта. Символы конца строки «0x0D, 0x0A» из подсчёта убраны. »
Работает на ура.можно ли добавить словарь "кастомных" символов?

Iska
15-10-2017, 14:23
можно ли добавить словарь "кастомных" символов? »
Что это значит? Поясните.

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

megaloman
15-10-2017, 18:43
Скрипт перебирает содержимое файла по одному символу и считает их количество (за вычетом символов конца строки). » 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
megaloman, хе-хе, интересная задумка с Replace'ом :).

megaloman
16-10-2017, 21:55
@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
var strContent = Txt.ReadAll().replace(/\r|\n/g, ''); »
/[\r\n]/g
— не? Альтернатива тоже работает, но, насколько я понимаю, в большее число подстановок.




© OSzone.net 2001-2012