<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=5240</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5240&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/VBS: Добавление символов в строку и сохранение rtf в txt».]]></description>
		<lastBuildDate>Tue, 21 Dec 2010 20:44:30 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42922#p42922</link>
			<description><![CDATA[<p>... (обсуждалось на http://forum.script-coding.info) <br />Тема закончилась следующим:<br /></p><div class="codebox"><pre><code>&#039;-----------------------------------------------------------------------------------------------------------------------
&#039; 14.12.2010
&#039; Конвертор rtf в txt с выборочным преобразованием текста
&#039; Перебирает файлы папки sInFolderName, в подпапках не ищет. Все найденные файлы с расширением rtf пытается открыть и 
&#039; при успехе преобразует в txt с кодировкой CP866 (DOS), сохраняя их с теми же именами в папку sOutFolderName 
&#039; (имеющиеся файлы молча перезаписывает)
&#039; 
&#039; Папки sInFolderName и sOutFolderName находятся в одной папке с запускаемым скриптом
&#039; 
&#039; Дополнительные преобразования текста: 
&#039;   убирает пустые строки
&#039;   заменяет вхождения строк массива aPatterns на строки массива aReplaces
&#039;-----------------------------------------------------------------------------------------------------------------------
option explicit

dim sInFolderName  : sInFolderName  = &quot;In&quot;  &#039;Имя папки входящих (rtf)
dim sOutFolderName : sOutFolderName = &quot;Out&quot; &#039;Имя папки с результатами (txt)

&#039;sCurFolder =&gt; диск:\путь_запуска_данного_скрипта\
dim sCurFolder : sCurFolder = Mid(WScript.ScriptFullName, 1, Len(WScript.ScriptFullName) - Len(WScript.ScriptName)) 
dim oFS : set oFS = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
dim sInFolderPath, sOutFolderPath
sInFolderPath = sCurFolder &amp; sInFolderName
sOutFolderPath = sCurFolder &amp; sOutFolderName

const wdFormatText = 2
dim i
dim aPatterns : aPatterns = Array(&quot;(RD1\|[^\|]+\|[^\|]+\|)&quot;, &quot;(RD2\|[^\|]+\|[^\|]+\|)&quot;, &quot;(RD3\|[^\|]+\|[^\|]+\|)&quot;)
dim aReplaces : aReplaces = Array(&quot;$120|&quot;, &quot;$130|&quot;, &quot;$131|&quot;)
if UBound(aPatterns) &lt;&gt; UBound(aReplaces) then &#039;антиглупин
  WScript.Echo &quot;Число масок поиска aPatterns не соответствует числу замен aReplaces - надо исправить!&quot; &amp; _
    &quot; (ничего не сделано)&quot;
end if

if oFS.FolderExists(sInFolderPath) and oFS.FolderExists(sOutFolderPath) then
  dim oInFolder : set oInFolder = oFS.GetFolder(sInFolderPath)
  dim oFile
  dim oW : set oW = WScript.CreateObject(&quot;Word.Application&quot;)
  for each oFile in oInFolder.Files
    dim re : set re = CreateObject(&quot;VBScript.RegExp&quot;)
    re.Pattern = &quot;\.rtf$&quot;
    re.IgnoreCase = true
    if re.Test(oFile.Path) then &#039;файл оканчивается на &quot;.rtf&quot;
      dim sText
      dim sFileOut : sFileOut = sOutFolderPath &amp; &quot;\&quot; &amp; re.Replace(oFile.Name, &quot;.txt&quot;) &#039;Результат
      
      on error resume next
      with oW.Documents.Open(oFile.Path)
        &#039; oW.Visible = true &#039;если хотим полюбоваться мельканием окошек
        oW.Selection.WholeStory
        sText = oW.Selection.Text
        
        &#039;избавляемся от пустых строк
        re.Pattern = &quot;(^\s*$)+(^.)&quot;
        re.Global = true
        re.Multiline = true
        sText = re.Replace(sText, &quot;&quot;)
        &#039;RD-замены
        for i = 0 to UBound(aPatterns)
          re.Pattern = aPatterns(i)
          sText = re.Replace(sText, aReplaces(i))
        next
        
        oW.Selection = sText &#039;вставляем измененный текст взамен прежнего
        with oW.Selection.ParagraphFormat &#039;убираем отступы форматирования, чтобы они не стали в txt пробелами
          .LeftIndent = 0
          .RightIndent = 0
          .SpaceBefore = 0
          .FirstLineIndent = 0
        end with
        .SaveAs sFileOut, wdFormatText, , , , , , , , , , 866
        .Close
      end with
      if Err then
        WScript.Echo &quot;Ошибка при работе с &#039;&quot; &amp; oFile.Name &amp; &quot;&#039;  &quot; &amp; Err.Number &amp; &quot; &quot; &amp; Err.Description
      end if
      on error goto 0
    end if &#039;файл оканчивается на &quot;.rtf&quot;
  next
  oW.Quit
  set oW = Nothing
else
  WScript.Echo &quot;Не нашлось входной (&#039;&quot; &amp; sInFolderPath &amp; &quot;&#039;) или выходной (&#039;&quot; &amp; sOutFolderPath &amp; _
    &quot;&#039;) папок.  (ничего не сделано)&quot;
end if &#039;есть все нужные папки

&#039;Синтаксис на память:
&#039; Sub SaveAs([FileName], [FileFormat], [LockComments], [Password], [AddToRecentFiles], [WritePassword], [ReadOnlyRecommended], [EmbedTrueTypeFonts], [SaveNativePictureFormat], [SaveFormsData], [SaveAsAOCELetter], [Encoding], [InsertLineBreaks], [AllowSubstitutions], [LineEnding], [AddBiDiMarks])</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Tue, 21 Dec 2010 20:44:30 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42922#p42922</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42852#p42852</link>
			<description><![CDATA[<p>Здравствуйте, возвращаясь к своей проблеме хочу сказать что дело потихоньку продвигается. Вот только возник вопрос как заставить скрипт просматривать по очереди все строки <strong>текстового</strong> файла и делать с ними какие то действия?<br />Я так&nbsp; понял что это должен быть цикл, типа<br /></p><div class="codebox"><pre><code>задаем файл (c:\test.txt он содержит например 20 каких то строк)
for each строка in файл
&quot;какое то действие с этой строкой&quot; (ну например вывод содержимого строки в сообщении)
next</code></pre></div><p>по идее должно выскочить по очереди 20 сообщений с содержимым каждой строки.<br />только как это реализовать что то не понял...</p>]]></description>
			<author><![CDATA[null@example.com (Djdfy)]]></author>
			<pubDate>Mon, 13 Dec 2010 10:37:20 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42852#p42852</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42711#p42711</link>
			<description><![CDATA[<p><img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /> Нашлось, <a href="http://www.forum.mista.ru/topic.php?id=288500">как работать в Word с текстом</a>.<br /></p><div class="codebox"><pre><code>Selection.WholeStory //выделить все
Selection.Text //обратиться к выделенному тексту</code></pre></div><p>Конечно с поправкой на то, что пример в 1С.</p><p>И вообще, если открыть Word, записать макрос с желаемыми действиями, а потом его (макрос) открыть на изменение - без дополнительных примеров становится ясно, как отдать на растерзание VBS&#039;у содержимое документа. <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Wed, 08 Dec 2010 15:19:03 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42711#p42711</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42702#p42702</link>
			<description><![CDATA[<div class="quotebox"><cite>Djdfy пишет:</cite><blockquote><p><strong>jite</strong> дело в том что я не силен в написании скриптов, и к сожалению я не понял как использовать эти фрагменты кода. Как заставить его перебирать файлы в папке, да еще и все строки в каждом файле, при этом сразу сохранять отредактированную строку в новый файл и при этом удалять пустые строки, да еще и следить за тем чтобы в соответствующую строку он вставлял нужное значение (RD1-20; RD2-10; RD3-30). ну помогите еще раз...</p></blockquote></div><p>Есть документация, которую можно почитать, или Вам надо решить задачу с нуля? Судя по Вашему ответу Вы не знаете базовых понятий программирования и данного языка. Надо больше читать, тогда такие просьбы не будут возникать. </p><p>Я отвечу Вам, но прямого решения не дам. Не мой стиль.</p><p>Представьте, что в библиотеку проник злобный книжный хулиган, который собирается испортить книжки. Портить он их будет так. На всех картинках с добрыми героями он будет писать неприличное слово, а листы с началом и окончанием каждой главы вырывать. Как он будет делать? <br />Подойдет к стеллажу (<em>каталог на диске</em>), возьмет книжку (<em>откроет файл</em>) и начнет листать (<em>просматривать каждую строку файла</em>). Если на странице нарисован добрый герой - пишет неприличное слово (<em>в каждой строке начинающейся с RD1 ... вставлялось 20</em>). Если на странице начало новой главы, или конец текущей главы - то вырывает весь лист (<em>удалять пустые строки</em>). После этого он ставит книжку на место (<em>закрывает файл</em>) и повторяет все действия - берет книжку, листает и т.д. </p><p>Получилось витиевато, но точно отражает суть Вашей задачи. А коллега <strong>jite</strong> поделился хорошей ссылкой.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Wed, 08 Dec 2010 09:02:31 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42702#p42702</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42701#p42701</link>
			<description><![CDATA[<p>Сейчас, извините, нет времени написать полный код. Позже поясню как все слепить, ага.<br />А вы пока разберитесь с нехитрой процедурой <a href="http://forum.script-coding.com/viewtopic.php?id=4402">перебора файлов</a>, вот <a href="http://www.script-coding.com/WSH/FileSystemObject.html">пояснения</a>.<br />Как разберетесь оформите под свои реалии, бросайте код сюда, тут мы его и дополним.</p><p><strong>Заодно подождем, может кто из знатоков объекта Word подтянется: хорошо было бы узнать, как можно просто прочесть в одну строку весь текст из Word-файла.</strong></p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Wed, 08 Dec 2010 08:45:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42701#p42701</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42699#p42699</link>
			<description><![CDATA[<p><strong>jite</strong> дело в том что я не силен в написании скриптов, и к сожалению я не понял как использовать эти фрагменты кода. Как заставить его перебирать файлы в папке, да еще и все строки в каждом файле, при этом сразу сохранять отредактированную строку в новый файл и при этом удалять пустые строки, да еще и следить за тем чтобы в соответствующую строку он вставлял нужное значение (RD1-20; RD2-10; RD3-30). ну помогите еще раз...</p>]]></description>
			<author><![CDATA[null@example.com (Djdfy)]]></author>
			<pubDate>Wed, 08 Dec 2010 07:22:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42699#p42699</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42689#p42689</link>
			<description><![CDATA[<p><strong>jite</strong> именно так, Вы совершенно правильно все поняли.<br />Извиняюсь за неточно поставленную задачу.</p>]]></description>
			<author><![CDATA[null@example.com (Djdfy)]]></author>
			<pubDate>Tue, 07 Dec 2010 20:09:45 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42689#p42689</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42673#p42673</link>
			<description><![CDATA[<p>Пахнет регулярными выражениями.<br /></p><div class="quotebox"><cite>Djdfy пишет:</cite><blockquote><p>где Х- это любая цифра</p></blockquote></div><p>и кусок из файла:<br /></p><div class="quotebox"><cite>Djdfy пишет:</cite><blockquote><p>19906.37|0.00|0.00|19906.37</p></blockquote></div><p>1) Вижу, что X это не любая цифра, а цифра, точка или дефис. (добавьте, если еще чего упустил)<br />2) RD1 это не начало строки, как вы указываете... ну да ладно</p><p>3) Самое важное. Можно организовать все просто (проигнорировав пп. 1-2), если справедливы следующие условия замены:<br />После RD1|(что угодно, но не &quot;|&quot;)|(что угодно, но не &quot;|&quot;)| надо добавить &quot;20|&quot;<br />После RD2|(что угодно, но не &quot;|&quot;)|(что угодно, но не &quot;|&quot;)| надо добавить &quot;30|&quot;<br />После RD3|(что угодно, но не &quot;|&quot;)|(что угодно, но не &quot;|&quot;)| надо добавить &quot;31|&quot;<br />Я правильно переформулировал условия?<br />Если да, то вот примерно такие у вас будут регулярные выражения:<br /></p><div class="codebox"><pre><code>dim re, str
set re = CreateObject(&quot;VBScript.RegExp&quot;)
re.Pattern = &quot;(RD1\|[^\|]+\|[^\|]+\|)&quot;
str = &quot;RD1|010|18210102010013000110|108.00|0.00|0.00|108.00|&quot;
WScript.Echo re.replace(str, &quot;$1ля-ля|&quot;)</code></pre></div><p>Вопрос выбрасывания пустых строк и конвертации в txt это отдельная подзадачка.<br />Вот пример конвертации файла из rtf в текст CP866:<br /></p><div class="codebox"><pre><code>const wdFormatText = 2
dim sCurFolder : sCurFolder = Mid(WScript.ScriptFullName, 1, Len(WScript.ScriptFullName) - Len(WScript.ScriptName))
dim sFileIn : sFileIn = sCurFolder &amp; &quot;1.rtf&quot; &#039;Подопытный
dim sFileOut : sFileOut = sCurFolder &amp; &quot;1.txt&quot; &#039;Результат
dim oFS : set oFS = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
dim oW : set oW = WScript.CreateObject(&quot;Word.Application&quot;)
With oW.Documents.Open(sFileIn)
  .SaveAs sFileOut, wdFormatText, , , , , , , , , , 866
&#039; Sub SaveAs([FileName], [FileFormat], [LockComments], [Password], [AddToRecentFiles], [WritePassword], [ReadOnlyRecommended], [EmbedTrueTypeFonts], [SaveNativePictureFormat], [SaveFormsData], [SaveAsAOCELetter], [Encoding], [InsertLineBreaks], [AllowSubstitutions], [LineEnding], [AddBiDiMarks])
  .Close
End With
oW.Quit</code></pre></div><p>Общий алгоритм действий:<br />1) Как либо выбираем rtf-файл (логично положить все файлы в одну папку, а потом программно перебрать по одному), конвертим-сохраняем его в 866 txt.<br />2) Открываем получившийся файл, читаем построчно и меняем (по 3 разных replace() на строку) RD-вхождения. Результаты склеиваем в новый текст.<br />3) Видимо в том же цикле проверяем, не пуста ли строка &quot;^\s*$&quot;, и если да, пропускаем (не добавляем к результирующему тексту).<br />4) Перезаписываем файл получившимся текстом. Если текст большой (ну не знаю, несколько сотен MB или просто на глаз тормозит), можно не накапливать текст в памяти, а тут же писать обработанные строки в другой файл - он будет финальным, а тот что сохранен Word&#039;ом, удаляем.</p><p><em>Если кто видит в алгоритме методические огрехи, поправьте пожалуйста. У меня есть подозрение, что у OpenTextFile() будут проблемы с чтением записью CP866, но может и нет - заменяем не там где русский текст, должно как прочитаться, так и записаться? Не было случая реализовать полностью.<br />И вообще, видимо лучше все обработать прямо внутри открытого Word&#039;ом документа. Опять же не было опыта - как там строчки перебирать?</em></p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Tue, 07 Dec 2010 14:58:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42673#p42673</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42651#p42651</link>
			<description><![CDATA[<p>Здравствуйте, я извиняюсь, я немного непонятно описал задание.<br />Попробую еще раз:<br />есть файл file.rtf (<a href="http://vozmifail.ifolder.ru/20662069">http://vozmifail.ifolder.ru/20662069</a>) в нем есть строки вида<br />RD1|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|ХХХХХХ|ХХХХ|ХХХ|ХХХХХХХХХ|<br />RD2|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|ХХХХХХ|ХХХХ|ХХХ|ХХХХХХХХХ|<br />RD3|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|ХХХХХХХХ|ХХХ|ХХХ|ХХХХХХХХХХ|<br />где Х- это любая цифра<br />Нужно что бы в каждой строке начинающейся с RD1 после RD1|ХХХ|ХХХХХХХХХХХХХХХХХХХХ| вставлялось 20| и получалось<br />RD1|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|20|ХХХХХХ|ХХХХ|ХХХ|ХХХХХХХХХ|<br />в каждой строке начинающейся с RD2 после RD2|ХХХ|ХХХХХХХХХХХХХХХХХХХХ| вставлялось 10| и получалось<br />RD2|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|10|ХХХХХХ|ХХХХ|ХХХ|ХХХХХХХХХ|<br />в каждой строке начинающейся с RD3 после RD3|ХХХ|ХХХХХХХХХХХХХХХХХХХХ| вставлялось 31| и получалось<br />RD3|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|31|ХХХХХХХХ|ХХХ|ХХХ|ХХХХХХХХХХ|<br />при этом в файле присутствуют пустые строки, их нужно убирать. После этого файл нужно сохранить в формат txt в кодировке DOS-866<br />т.е. должен получиться такой file.txt (<a href="http://vozmifail.ifolder.ru/20662221">http://vozmifail.ifolder.ru/20662221</a>)<br />вроде так должно быть понятнее.</p>]]></description>
			<author><![CDATA[null@example.com (Djdfy)]]></author>
			<pubDate>Tue, 07 Dec 2010 06:59:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42651#p42651</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42457#p42457</link>
			<description><![CDATA[<p>файл ртф выложте<br />а в указанном тексте заменить примерно<br /></p><div class="codebox"><pre><code>echo off
setlocal ENABLEDELAYEDEXPANSION
set filertf=file.txt
set &quot;pattern=|6|&quot;
for /f &quot;delims=&quot; %%i in (%filertf%) do (
    set out=%%i
    set &quot;out=!out:%pattern%=|55|6|!&quot;
    echo !out!
    )</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Sat, 04 Dec 2010 06:46:15 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42457#p42457</guid>
		</item>
		<item>
			<title><![CDATA[CMD/VBS: Добавление символов в строку и сохранение rtf в txt]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=42441#p42441</link>
			<description><![CDATA[<p>Здравствуйте, помогите пожалуйста со скриптом или командным файлом,<br />Есть файл 1.rtf со следующим содержимым:<br />111|222|3333333|<br />1111|2222|33|44444|55555|66|777|<br />1|22|333333|44444444444|6|777777|8888|<br />из него нужно сделать такой файл<br />111|222|3333333|<br />1111|2222|33|44444|55555|66|777|<br />1|22|333333|44444444444|<strong>55|</strong>6|777777|8888|<br />т.е. в определенной строке в определенном месте добавить несколько символов, после этого сохранить файл&nbsp; в 1.txt в кодировке dos-866<br />и в идеале еще бы и пустые строки поубирать, дело в том что в файле (в разных местах) есть пустые строки, было бы отлично если бы скрипт находил их и удалял.<br />Заранее спасибо всем кто примет участие в оказании помощи утопающему. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Djdfy)]]></author>
			<pubDate>Fri, 03 Dec 2010 11:26:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=42441#p42441</guid>
		</item>
	</channel>
</rss>
