Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Подсчет количества одинаковых символов в txt файле

Ответить
Настройки темы
CMD/BAT - Подсчет количества одинаковых символов в txt файле

Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 08:39, 15-10-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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» из подсчёта убраны.
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:32, 15-10-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 14:00, 15-10-2017 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата ia_del@vk:
можно ли добавить словарь "кастомных" символов? »
Что это значит? Поясните.

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

Отправлено: 14:23, 15-10-2017 | #4


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить PM | Цитировать


Цитата 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
Не вижу особого смысла в задаче, разве что учебный. А по делу неплохо бы еще отсортировать вывод в порядке следования кодов символов.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:43, 15-10-2017 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 19:42, 15-10-2017 | #6


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить PM | Цитировать


Вот симбиоз батника и 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"');}

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:55, 16-10-2017 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата megaloman:
var strContent = Txt.ReadAll().replace(/\r|\n/g, ''); »
Код: Выделить весь код
/[\r\n]/g
— не? Альтернатива тоже работает, но, насколько я понимаю, в большее число подстановок.

Отправлено: 22:23, 16-10-2017 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Подсчет количества одинаковых символов в txt файле

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Подсчет количества чисел в файле nastasa Скриптовые языки администрирования Windows 2 09-10-2016 18:47
CMD/BAT - Подсчет количества одинаковых строк в txt файле lexis1980 Скриптовые языки администрирования Windows 1 19-11-2013 11:46
CMD/BAT - Подсчет количества строк в текстовом файле sl1mus Скриптовые языки администрирования Windows 3 28-06-2012 21:29
CMD/BAT - Подсчет количества целых чисел в текстовом файле Hardip Скриптовые языки администрирования Windows 5 08-12-2010 14:49
Подсчет количества лицензий. Zergling Microsoft Windows NT/2000/2003 0 24-04-2007 14:57




 
Переход