<?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=6956&amp;type=atom" />
	<updated>2012-03-18T14:01:36Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=6956</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58018#p58018" />
			<content type="html"><![CDATA[<p>Возможно. Но опыт говорит о противоположном. Это менее затратная операция чем конкатенация строк.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2012-03-18T14:01:36Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58018#p58018</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58017#p58017" />
			<content type="html"><![CDATA[<p>Хмм… «ReDim Preserve …» — <em>очень</em> затратная операция.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-03-18T13:26:26Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58017#p58017</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58015#p58015" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Mat Skywalker пишет:</cite><blockquote><p>как еще можно решить подобную задачу, чтобы работало пошустрее</p></blockquote></div><p>Упростите алгоритм - у Вас три избыточных сравнения, что может привести как к замедлению работы скрипта, так и к ошибкам. Избавьтесь от копирования строк - это очень трудоемкий процесс. Если все данные все-таки необходимы, то храните данные в массиве. </p><p>Первый вариант (без сохранения данных, запись в консоль)<br /></p><div class="codebox"><pre><code>
Function TXTwrite2(N)
	On Error Resume Next
	Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
	Set f = fso.OpenTextFile(FileName, 1)
	L = 0
	Do Until f.AtEndOfStream
		S = f.ReadLine
		L = L + 1

		&#039; строка найдена ...
		If N = L Then
			&#039; ... что-то сделать с ней ...
			S = &lt;...&gt;
		End If
		&#039; ... и тут же вывести на консоль
		WScript.Echo S
	Loop
	f.Close
End Function</code></pre></div><p>Второй вариант (данные сохраняются и пишутся в тот же файл)<br /></p><div class="codebox"><pre><code>
Function TXTwrite3(N)
	On Error Resume Next

	&#039; массив хранения всех строк входного файла
	Dim result()
	&#039; текущий размер массива
	M = 0
	&#039; величина на которую увеличиваем массив
	Incr = 100

	Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
	Set f = fso.OpenTextFile(FileName, 1)
	L = 0
	&#039; строки отсчитываем с нуля
	N = N - 1
	Do Until f.AtEndOfStream
		S = f.ReadLine
		&#039; строка найдена ...
		If N = L Then
			&#039; ... что-то сделать с ней ...
			S = &lt;...&gt;
		End If
		&#039; убедиться, что емкости массива достаточно для хранения всех строк
		If L Mod Incr = 0 Then
			M = M + Incr
			ReDim Preserve result(M)
		End If
		&#039; сохранить все строки во временном массиве
		result(L) = S
		L = L + 1
	Loop
	f.Close

	&#039; сохранить все строки (оригинальные и измененные)
	Set f = fso.OpenTextFile(FileName, 2)
	For I = 0 To L - 1
		f.WriteLine result(I)
	Next
	f.Close
End Function</code></pre></div><p>В обоих случаях файл размером в 20тыс строк был прочитан и изменен за 2-3 секунды</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2012-03-18T12:16:52Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58015#p58015</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58014#p58014" />
			<content type="html"><![CDATA[<p>1. arrLines = Split(.ReadAll(), vbCrLf); arrLines(N) = &quot;bla-bla-bla&quot;; Write(Join(arrLines, vbCrLf)).<br />2. При <em>очень</em> большой размере — пытаться работать с файлом, как с базой данных.</p><p>По Вашему коду. Применять это:<br /></p><div class="codebox"><pre><code>    On Error Resume Next</code></pre></div><p>бездумно — не стоит совершенно.</p><p>Это:<br /></p><div class="codebox"><pre><code>    Set WshShell = CreateObject(&quot;WScript.Shell&quot;)
    path = WshShell.CurrentDirectory + &quot;\&quot;</code></pre></div><p>в данном случае совершенно лишнее. Работа и так будет идти с текущим каталогом.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-03-18T11:55:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58014#p58014</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=58009#p58009" />
			<content type="html"><![CDATA[<p>Для одного небольшого проекта была сделана такая функция:<br /></p><div class="codebox"><pre><code>
Function TXTwrite(LineN, strTP) &#039; Номер строки и сама строка для записи
	On Error Resume Next
	Set WshShell = CreateObject(&quot;WScript.Shell&quot;)
	path = WshShell.CurrentDirectory + &quot;\&quot;
	Set objFS = CreateObject(&quot;Scripting.FileSystemObject&quot;)
	writDO=&quot;&quot;
	writPOS=&quot;&quot;
	Set objFS = CreateObject(&quot;Scripting.FileSystemObject&quot;)
	Set objTS = objFS.OpenTextFile(Path+&quot;flm.tmp&quot;, 1) &#039; Файл flm.tmp содержит набор записей с разделителем |
	ks=0
	LineN=CLng(LineN)
	Do Until objTS.AtEndOfStream
	ks=ks+1
	if ks&lt;LineN then writDO=writDO+objTS.Readline &amp;  VbCrLf
		if ks=LineN then 
		Str=objTS.ReadLine
		strArr=Split(str,&quot;|&quot;,-1,1)
		writITM=strArr(0)&amp;&quot;|&quot;&amp;strArr(1)&amp;&quot;|&quot;&amp;strArr(2)&amp;&quot;|&quot;
		End If
	if ks&gt;LineN then writPOS=writPOS+objTS.Readline &amp;  VbCrLf
	loop
	objTS.close
	Set objTS = objFS.OpenTextFile(Path+&quot;flm.tmp&quot;, 2)
	objTS.Write writDO &amp;Left(writITM,len(writITM)-1) &amp;&quot;|&quot; &amp;strTP &amp;  VbCrLf &amp; writPOS &#039; Содержимое файла ДО искомой строки + нужная нам строка + содержимое файла после
	objTS.close
	TXTwrite=0
End Function</code></pre></div><p>Если работать с файлом на 20-30 строк то все красиво. Но тут понадобилось делать тоже самое с файлом в 12000 строк и стало все совсем медленно.<br />Вопрос: как еще можно решить подобную задачу, чтобы работало пошустрее <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[Mat Skywalker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26275</uri>
			</author>
			<updated>2012-03-18T09:41:33Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=58009#p58009</id>
		</entry>
</feed>
