<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS Запись в текстовый файл строки с произвольным номером]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6956</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6956&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS Запись в текстовый файл строки с произвольным номером».]]></description>
		<lastBuildDate>Sun, 18 Mar 2012 14:01:36 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58018#p58018</link>
			<description><![CDATA[<p>Возможно. Но опыт говорит о противоположном. Это менее затратная операция чем конкатенация строк.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 18 Mar 2012 14:01:36 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58018#p58018</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58017#p58017</link>
			<description><![CDATA[<p>Хмм… «ReDim Preserve …» — <em>очень</em> затратная операция.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 18 Mar 2012 13:26:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58017#p58017</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58015#p58015</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 18 Mar 2012 12:16:52 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58015#p58015</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58014#p58014</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 18 Mar 2012 11:55:08 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58014#p58014</guid>
		</item>
		<item>
			<title><![CDATA[VBS Запись в текстовый файл строки с произвольным номером]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58009#p58009</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Mat Skywalker)]]></author>
			<pubDate>Sun, 18 Mar 2012 09:41:33 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58009#p58009</guid>
		</item>
	</channel>
</rss>
