<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS:Подсчет количества совпадающих строк в файле]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=14197&amp;type=atom" />
	<updated>2018-09-30T17:30:02Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=14197</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128960#p128960" />
			<content type="html"><![CDATA[<p><strong>alexii</strong>, действительно. <img src="//forum.script-coding.com/img/smilies/neutral.png" width="15" height="15" /> Сейчас переписал скрипт и с кодировкой вроде бы всё нормально. Странно. До этого получал искажения.<br /></p><div class="codebox"><pre><code>
Option Explicit
Dim oDict, sValue
&#039;Создание коллекции для накопления результатов
Set oDict = CreateObject(&quot;Scripting.Dictionary&quot;)
&#039;Включение текстового режима сравнения строк для игнорирования регистра символов (На случай &quot;Таня&quot; и &quot;таня&quot;)
oDict.CompareMode = 2
&#039;Получение строк из входящего потока
While Not WSH.StdIn.AtEndOfStream
	&#039;Чтение строки из потока
	sValue = Trim(WSH.StdIn.ReadLine)
	&#039;Накопление результата
	If sValue &lt;&gt; &quot;&quot; Then oDict(sValue) = oDict(sValue) + 1
Wend
&#039;Вывод результатов подсчёта в выходной поток
For Each sValue in oDict.Keys
	&#039;Вывод результатов подсчёта обратно в поток
	WSH.StdOut.WriteLine sValue &amp; &quot;: &quot; &amp; oDict(sValue)
Next
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2018-09-30T17:30:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128960#p128960</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128959#p128959" />
			<content type="html"><![CDATA[<p>А что с ними не так? У меня вроде бы читают входной файл, переданный на вход stdin, как ANSI, и в ней же делают вывод в stdout. Что сscript.exe, что wscript.exe.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2018-09-30T17:04:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128959#p128959</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128957#p128957" />
			<content type="html"><![CDATA[<p><strong>alexii</strong><br /></p><div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Вот, кстати, да. А я забыл про сё <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" />.</p></blockquote></div><p>Ну судя по всему у топикстатера это проблем не вызвало. ) А не подскажете как пофиксить проблемку с кодировкой у <strong>WSH.StdIn</strong> и <strong>WSH.StdOut</strong> ? Мне для личного опыта.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2018-09-30T16:25:07Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128957#p128957</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128956#p128956" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><div class="codebox"><pre><code>&#039;Включение текстового режима сравнения строк для игнорирования регистра символов (На случай &quot;Таня&quot; и &quot;таня&quot;)
oDict.CompareMode = 2</code></pre></div></blockquote></div><p>Вот, кстати, да. А я забыл про сё <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" />.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2018-09-30T16:03:38Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128956#p128956</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128955#p128955" />
			<content type="html"><![CDATA[<p>Решил тоже немного поучаствовать.<br /><strong>counter.vbs</strong><br /></p><div class="codebox"><pre><code>
Option Explicit
Dim oStdIn, oStdOut, oDict, sValue
&#039;Получение объекта для работы с файловой системой (но в данном случае для получения доступа к входящему и выходному потоку)
With CreateObject(&quot;Scripting.FileSystemObject&quot;)
	&#039;Получение входящего потока
	Set oStdIn = .GetStandardStream(0)
	&#039;Получение выходного потока
	Set oStdOut = .GetStandardStream(1)
End With
&#039;Создание коллекции для накопления результатов
Set oDict = CreateObject(&quot;Scripting.Dictionary&quot;)
&#039;Включение текстового режима сравнения строк для игнорирования регистра символов (На случай &quot;Таня&quot; и &quot;таня&quot;)
oDict.CompareMode = 2
&#039;Получение строк из входящего потока
While Not oStdIn.AtEndOfStream
	&#039;Чтение строки из потока
	sValue = Trim(oStdIn.ReadLine)
	&#039;Накопление результата
	If sValue &lt;&gt; &quot;&quot; Then oDict(sValue) = oDict(sValue) + 1
Wend
&#039;Вывод результатов подсчёта в выходной поток
For Each sValue in oDict.Keys
	&#039;Вывод результатов подсчёта обратно в поток
	oStdOut.WriteLine sValue &amp; &quot;: &quot; &amp; oDict(sValue)
Next
</code></pre></div><p><strong>test.cmd</strong><br /></p><div class="codebox"><pre><code>
@echo off
cscript //NOLOGO counter.vbs &lt; data.txt &gt; result.txt
pause
</code></pre></div><p>(!) Для запуска нужен <strong>data.txt</strong> с записями в том же каталоге</p><p>Хотел использовать <strong>WSH.StdIn</strong> и <strong>WSH.StdOut</strong>, но при этом не нашёл как настроить кодировку потоков, из-за этого ANSI файлы неправильно читались. Поэтому использовал <strong>GetStandardStream</strong>. Но наверняка как-то можно обойтись и без него.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2018-09-30T15:54:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128955#p128955</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128943#p128943" />
			<content type="html"><![CDATA[<p><strong>griha09</strong>, пользуйте cscript.exe по умолчанию вместо wscript.exe — и будет Вам счастье <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p><span class="postimg"><img src="https://i.imgur.com/n7rmFYl.png" alt="https://i.imgur.com/n7rmFYl.png" /></span></p></div></div>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2018-09-29T19:28:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128943#p128943</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128942#p128942" />
			<content type="html"><![CDATA[<p>Rumata, alexii&nbsp; огромное спасибо за код.<br />alexii, строка WScript.Echo strKey, vbTab, objDictionary.Item(strKey)&nbsp; -&nbsp; вывод в MessageBox&#039;ов явно лишнее (я заиб*лся их закрывать)</p>]]></content>
			<author>
				<name><![CDATA[griha09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27540</uri>
			</author>
			<updated>2018-09-29T18:50:21Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128942#p128942</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128920#p128920" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>Option Explicit

Dim strSourceFile
Dim strDestFile

Dim objFSO
Dim objDictionary

Dim arrContent

Dim strValue
Dim strKey


If WScript.Arguments.Count = 1 Then
	strSourceFile = WScript.Arguments.Item(0)
	
	Set objFSO = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
	
	If objFSO.FileExists(strSourceFile) Then
		strDestFile = objFSO.BuildPath(objFSO.GetParentFolderName(strSourceFile), objFSO.GetBaseName(strSourceFile) &amp; &quot;_Counts.csv&quot;)
		
		Set objDictionary = WScript.CreateObject(&quot;Scripting.Dictionary&quot;)
		
		With objFSO.OpenTextFile(strSourceFile)
			arrContent = Split(.ReadAll(), vbCrLf)
			.Close
		End With
		
		For Each strValue In arrContent
			If Not objDictionary.Exists(strValue) Then
				objDictionary.Add strValue, 1
			Else
				objDictionary.Item(strValue) = objDictionary.Item(strValue) + 1
			End If
		Next
		
		With objFSO.CreateTextFile(strDestFile, True)
			For Each strKey In objDictionary.Keys
				WScript.Echo strKey, vbTab, objDictionary.Item(strKey)
				.WriteLine strKey &amp; &quot;,&quot; &amp; objDictionary.Item(strKey)
			Next
			
			.Close
		End With
		
		Set objDictionary = Nothing
	Else
		WScript.Echo &quot;Can&#039;t find source file [&quot; &amp; strSourceFile &amp; &quot;].&quot;
		WScript.Quit 2
	End If
	
	Set objFSO = Nothing
Else
	WScript.Echo &quot;Usage: cscript.exe //nologo &quot;&quot;&quot; &amp; WScript.ScriptName &amp; &quot;&quot;&quot; &lt;Source file&gt;&quot;
	WScript.Quit 1
End If

WScript.Quit 0
</code></pre></div><p>Путь к исходному файлу указывается параметром скрипта (также можно просто перетащить исходный файл на скрипт в Проводнике). Результирующий файл будет иметь имя исходного файла + &quot;_Counts&quot; и расширение &quot;.csv&quot;.</p><p>В случае, если исходный файл имеет солидные размеры, можно подумать про использование OLE DB.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2018-09-29T08:53:42Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128920#p128920</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128918#p128918" />
			<content type="html"><![CDATA[<p>Предоставьте это сделать системе - пусть она все сделает сама. </p><p>Я немного поправил свое предыдущее сообщение:<br />-- изменил код скрипта <strong>line_count.bat</strong><br />-- соответственно этому изменил способ применения</p><p>От этого всё стало гибче. Теперь можно читать из файла или потока другой программы, писать в файл или поток другой программы. Примеры:<br /></p><div class="codebox"><pre><code>
:: прочитать один файл
:: обработать
:: записать в другой
line_count.bat &lt; INPUTFILE &gt; OUTPUTFILE

:: прочитать результат одной команды
:: обработать
:: записать в файл
command1 | line_count.bat &gt; OUTPUTFILE

:: прочитать файл
:: обработать
:: результат передать другой команде
line_count.bat &lt; INPUTFILE | command2

:: прочитать результат одной команды
:: обработать
:: результат передать другой команде
command1 | line_count.bat | command2
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2018-09-29T08:46:55Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128918#p128918</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128917#p128917" />
			<content type="html"><![CDATA[<p>Большое спасибо! Язык не принципиален. Только на JS я не умею записывать результат в файл. Как это сделать?</p>]]></content>
			<author>
				<name><![CDATA[griha09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27540</uri>
			</author>
			<updated>2018-09-29T08:06:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128917#p128917</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128912#p128912" />
			<content type="html"><![CDATA[<p>Идея заключается в следующем:<br />1. сортировка внешней командой SORT<br />2. скриптом VBScript или JScript читать вывод предыдущей команды SORT<br />3. сравнивать текущую строку с предыдущей<br />3.1. если строки одинаковые -- считать количество<br />3.2. если строки разные выводить предыдущую и ее количество<br />4. повторять с пункта 3 для каждой последующей строки</p><p>Здесь есть два граничных &quot;условия&quot;:<br />1. в начале файла -- нет предыдущей строки<br />2. в конце файла -- список кончился, но последнюю строку еще не вывели.</p><p>Если для Вас не принципиален язык (JS или VBS), приведу пример на JS</p><p><strong>line_count.js</strong></p><div class="codebox"><pre><code>
// предыдущая строка и количество одинаковых строк
var prev;
var count;

// печатать количество и строку
function print() {
	if ( count ) {
		WScript.StdOut.WriteLine(count + &quot;:&quot; + prev);
	}
}

while ( ! WScript.StdIn.AtEndOfStream ) {
	var line = WScript.StdIn.ReadLine();

	// считать количество одинаковых строк
	if ( line === prev ) {
		count++;
		continue;
	}

	// печатать количество и строку (предыдущий блок одинаковых строк)
	print();

	// сбросить счетчики
	count = 1;
	prev = line;
}

// печатать количество и строку (последний блок одинаковых строк)
print();
</code></pre></div><p><strong>line_count.bat</strong></p><div class="codebox"><pre><code>
@sort | cscript //nologo line_count.js
</code></pre></div><p>Способ применения:<br /></p><div class="codebox"><pre><code>
line_count.bat [&lt; INPUTFILE] [&gt; OUTPUTFILE]
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2018-09-28T22:13:47Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128912#p128912</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS:Подсчет количества совпадающих строк в файле]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=128910#p128910" />
			<content type="html"><![CDATA[<p>Всем привет, есть файл вида, например:<br />таня<br />дима<br />света<br />таня<br />толя<br />оля<br />света<br />иван<br />дима<br />таня</p><p>итд<br />надо подсчитать сколько раз повторяется каждая подстрока, и записать результат в др.файл<br />Т.е надо прочитать строку, сравнить ее с каждой из остальных, удалить совпадающие, подсчитать кол-во совпадающих строк и записать результат в другой файл. И так со всеми строками<br />&nbsp; <br />Просто найти известную подстроку, подсчитать, удалить и записать результат в др.файл я могу</p><div class="codebox"><pre><code>word = &quot;таня&quot; 				&#039;искомое слово
papka = &quot;c:\0\&quot;			&#039;папка поиска
output= papka&amp;&quot;отчет\&quot;			&#039;папка output
output_txt = output&amp;&quot;отчет.txt&quot;		&#039;файл отчета

i=0  &#039;счетчик файлов


Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set objRegExp = CreateObject(&quot;VBScript.RegExp&quot;)
If not objFSO.FolderExists(output) Then objFSO.CreateFolder output          &#039;создаем output

objRegExp.IgnoreCase = True
Set file2 = objFSO.OpenTextFile(output_txt, 2, True) 


RecursiveFolderScan papka
file2.close

Msgbox &quot;ВСЕ! Обработано &quot;&amp; i &amp;&quot; файлов&quot;


 Sub RecursiveFolderScan(FolderPath)
    &#039;Получаем объектную модель текущего каталога
    Set Folder = objFSO.GetFolder(FolderPath)
 
    &#039;Перебираем все файлы в текущем каталоге
    For Each File in Folder.Files
&#039;+++++++++++++++++++++++++++++++++++++++++

Set file1 = objFSO.OpenTextFile(File, 1, False)  &#039;читаем файл
boolFound = False
z=0  &#039;счетчик подстрок
       Do Until file1.AtEndOfStream
            sw = file1.ReadLine() &#039;по-строчно
            If InStr(1, sw, word) &lt;&gt; 0 Then z=z+1
        Loop
                file2.WriteLine(file.Name) &#039;пишем в отчет имя файла      
                file2.WriteLine(sw&amp;&quot; повторяется &quot;&amp;z&amp;&quot; раз&quot;) &#039;пишем в отчет всю строку
        file1.close &#039;закрываем файл

     

            Set file1 = objFSO.OpenTextFile(File, 1, False) &#039;снова читаем тот же файл
            strText = file1.ReadAll &#039;читаем все содержимое в переменную            
            file1.close &#039;и опять закрываем
            &#039;меняем все вхождения найденной строки на пробел - а надо наверное искомого слова - word
            strNewText = Replace(strText, sw, &quot; &quot;)             
 
            &#039;снова открываем тот же файл - на этот раз для записи - таким образом удаляя все содержимое файла
            Set file1 = objFSO.OpenTextFile(File, 2, False)
            file1.WriteLine strNewText &#039;пишем новое содержимое
            file1.close &#039;и закрываем в третий раз
  



i=i+1        &#039;счетчик файлов
&#039;++++++++++++++++++++++++++++++++++++++

    Next

End Sub</code></pre></div><p>А вот прочитать строку и сравнить ее с каждой из остальных и потом проделать это со всеми оставшимися строками пока не закончаться все строки - как это сделать мне не понятно.</p>]]></content>
			<author>
				<name><![CDATA[griha09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27540</uri>
			</author>
			<updated>2018-09-28T20:37:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=128910#p128910</id>
		</entry>
</feed>
