1

Тема: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

Здравствуйте, помогите пожалуйста со скриптом или командным файлом,
Есть файл 1.rtf со следующим содержимым:
111|222|3333333|
1111|2222|33|44444|55555|66|777|
1|22|333333|44444444444|6|777777|8888|
из него нужно сделать такой файл
111|222|3333333|
1111|2222|33|44444|55555|66|777|
1|22|333333|44444444444|55|6|777777|8888|
т.е. в определенной строке в определенном месте добавить несколько символов, после этого сохранить файл  в 1.txt в кодировке dos-866
и в идеале еще бы и пустые строки поубирать, дело в том что в файле (в разных местах) есть пустые строки, было бы отлично если бы скрипт находил их и удалял.
Заранее спасибо всем кто примет участие в оказании помощи утопающему.

2 (изменено: smaharbA, 2010-12-04 10:46:27)

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

файл ртф выложте
а в указанном тексте заменить примерно

echo off
setlocal ENABLEDELAYEDEXPANSION
set filertf=file.txt
set "pattern=|6|"
for /f "delims=" %%i in (%filertf%) do (
    set out=%%i
    set "out=!out:%pattern%=|55|6|!"
    echo !out!
    )
Я конечно далек от мысли... (с)

3

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

Здравствуйте, я извиняюсь, я немного непонятно описал задание.
Попробую еще раз:
есть файл file.rtf (http://vozmifail.ifolder.ru/20662069) в нем есть строки вида
RD1|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|ХХХХХХ|ХХХХ|ХХХ|ХХХХХХХХХ|
RD2|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|ХХХХХХ|ХХХХ|ХХХ|ХХХХХХХХХ|
RD3|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|ХХХХХХХХ|ХХХ|ХХХ|ХХХХХХХХХХ|
где Х- это любая цифра
Нужно что бы в каждой строке начинающейся с RD1 после RD1|ХХХ|ХХХХХХХХХХХХХХХХХХХХ| вставлялось 20| и получалось
RD1|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|20|ХХХХХХ|ХХХХ|ХХХ|ХХХХХХХХХ|
в каждой строке начинающейся с RD2 после RD2|ХХХ|ХХХХХХХХХХХХХХХХХХХХ| вставлялось 10| и получалось
RD2|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|10|ХХХХХХ|ХХХХ|ХХХ|ХХХХХХХХХ|
в каждой строке начинающейся с RD3 после RD3|ХХХ|ХХХХХХХХХХХХХХХХХХХХ| вставлялось 31| и получалось
RD3|ХХХ|ХХХХХХХХХХХХХХХХХХХХ|31|ХХХХХХХХ|ХХХ|ХХХ|ХХХХХХХХХХ|
при этом в файле присутствуют пустые строки, их нужно убирать. После этого файл нужно сохранить в формат txt в кодировке DOS-866
т.е. должен получиться такой file.txt (http://vozmifail.ifolder.ru/20662221)
вроде так должно быть понятнее.

4 (изменено: jite, 2010-12-08 00:07:57)

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

Пахнет регулярными выражениями.

Djdfy пишет:

где Х- это любая цифра

и кусок из файла:

Djdfy пишет:

19906.37|0.00|0.00|19906.37

1) Вижу, что X это не любая цифра, а цифра, точка или дефис. (добавьте, если еще чего упустил)
2) RD1 это не начало строки, как вы указываете... ну да ладно

3) Самое важное. Можно организовать все просто (проигнорировав пп. 1-2), если справедливы следующие условия замены:
После RD1|(что угодно, но не "|")|(что угодно, но не "|")| надо добавить "20|"
После RD2|(что угодно, но не "|")|(что угодно, но не "|")| надо добавить "30|"
После RD3|(что угодно, но не "|")|(что угодно, но не "|")| надо добавить "31|"
Я правильно переформулировал условия?
Если да, то вот примерно такие у вас будут регулярные выражения:

dim re, str
set re = CreateObject("VBScript.RegExp")
re.Pattern = "(RD1\|[^\|]+\|[^\|]+\|)"
str = "RD1|010|18210102010013000110|108.00|0.00|0.00|108.00|"
WScript.Echo re.replace(str, "$1ля-ля|")

Вопрос выбрасывания пустых строк и конвертации в txt это отдельная подзадачка.
Вот пример конвертации файла из rtf в текст CP866:

const wdFormatText = 2
dim sCurFolder : sCurFolder = Mid(WScript.ScriptFullName, 1, Len(WScript.ScriptFullName) - Len(WScript.ScriptName))
dim sFileIn : sFileIn = sCurFolder & "1.rtf" 'Подопытный
dim sFileOut : sFileOut = sCurFolder & "1.txt" 'Результат
dim oFS : set oFS = WScript.CreateObject("Scripting.FileSystemObject")
dim oW : set oW = WScript.CreateObject("Word.Application")
With oW.Documents.Open(sFileIn)
  .SaveAs sFileOut, wdFormatText, , , , , , , , , , 866
' Sub SaveAs([FileName], [FileFormat], [LockComments], [Password], [AddToRecentFiles], [WritePassword], [ReadOnlyRecommended], [EmbedTrueTypeFonts], [SaveNativePictureFormat], [SaveFormsData], [SaveAsAOCELetter], [Encoding], [InsertLineBreaks], [AllowSubstitutions], [LineEnding], [AddBiDiMarks])
  .Close
End With
oW.Quit

Общий алгоритм действий:
1) Как либо выбираем rtf-файл (логично положить все файлы в одну папку, а потом программно перебрать по одному), конвертим-сохраняем его в 866 txt.
2) Открываем получившийся файл, читаем построчно и меняем (по 3 разных replace() на строку) RD-вхождения. Результаты склеиваем в новый текст.
3) Видимо в том же цикле проверяем, не пуста ли строка "^\s*$", и если да, пропускаем (не добавляем к результирующему тексту).
4) Перезаписываем файл получившимся текстом. Если текст большой (ну не знаю, несколько сотен MB или просто на глаз тормозит), можно не накапливать текст в памяти, а тут же писать обработанные строки в другой файл - он будет финальным, а тот что сохранен Word'ом, удаляем.

Если кто видит в алгоритме методические огрехи, поправьте пожалуйста. У меня есть подозрение, что у OpenTextFile() будут проблемы с чтением записью CP866, но может и нет - заменяем не там где русский текст, должно как прочитаться, так и записаться? Не было случая реализовать полностью.
И вообще, видимо лучше все обработать прямо внутри открытого Word'ом документа. Опять же не было опыта - как там строчки перебирать?

5

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

jite именно так, Вы совершенно правильно все поняли.
Извиняюсь за неточно поставленную задачу.

6

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

jite дело в том что я не силен в написании скриптов, и к сожалению я не понял как использовать эти фрагменты кода. Как заставить его перебирать файлы в папке, да еще и все строки в каждом файле, при этом сразу сохранять отредактированную строку в новый файл и при этом удалять пустые строки, да еще и следить за тем чтобы в соответствующую строку он вставлял нужное значение (RD1-20; RD2-10; RD3-30). ну помогите еще раз...

7

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

Сейчас, извините, нет времени написать полный код. Позже поясню как все слепить, ага.
А вы пока разберитесь с нехитрой процедурой перебора файлов, вот пояснения.
Как разберетесь оформите под свои реалии, бросайте код сюда, тут мы его и дополним.

Заодно подождем, может кто из знатоков объекта Word подтянется: хорошо было бы узнать, как можно просто прочесть в одну строку весь текст из Word-файла.

8 (изменено: Rumata, 2010-12-08 13:03:05)

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

Djdfy пишет:

jite дело в том что я не силен в написании скриптов, и к сожалению я не понял как использовать эти фрагменты кода. Как заставить его перебирать файлы в папке, да еще и все строки в каждом файле, при этом сразу сохранять отредактированную строку в новый файл и при этом удалять пустые строки, да еще и следить за тем чтобы в соответствующую строку он вставлял нужное значение (RD1-20; RD2-10; RD3-30). ну помогите еще раз...

Есть документация, которую можно почитать, или Вам надо решить задачу с нуля? Судя по Вашему ответу Вы не знаете базовых понятий программирования и данного языка. Надо больше читать, тогда такие просьбы не будут возникать.

Я отвечу Вам, но прямого решения не дам. Не мой стиль.

Представьте, что в библиотеку проник злобный книжный хулиган, который собирается испортить книжки. Портить он их будет так. На всех картинках с добрыми героями он будет писать неприличное слово, а листы с началом и окончанием каждой главы вырывать. Как он будет делать?
Подойдет к стеллажу (каталог на диске), возьмет книжку (откроет файл) и начнет листать (просматривать каждую строку файла). Если на странице нарисован добрый герой - пишет неприличное слово (в каждой строке начинающейся с RD1 ... вставлялось 20). Если на странице начало новой главы, или конец текущей главы - то вырывает весь лист (удалять пустые строки). После этого он ставит книжку на место (закрывает файл) и повторяет все действия - берет книжку, листает и т.д.

Получилось витиевато, но точно отражает суть Вашей задачи. А коллега jite поделился хорошей ссылкой.

( 2 * b ) || ! ( 2 * b )

9

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

Нашлось, как работать в Word с текстом.

Selection.WholeStory //выделить все
Selection.Text //обратиться к выделенному тексту

Конечно с поправкой на то, что пример в 1С.

И вообще, если открыть Word, записать макрос с желаемыми действиями, а потом его (макрос) открыть на изменение - без дополнительных примеров становится ясно, как отдать на растерзание VBS'у содержимое документа.

10 (изменено: Djdfy, 2010-12-13 14:39:20)

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

Здравствуйте, возвращаясь к своей проблеме хочу сказать что дело потихоньку продвигается. Вот только возник вопрос как заставить скрипт просматривать по очереди все строки текстового файла и делать с ними какие то действия?
Я так  понял что это должен быть цикл, типа

задаем файл (c:\test.txt он содержит например 20 каких то строк)
for each строка in файл
"какое то действие с этой строкой" (ну например вывод содержимого строки в сообщении)
next

по идее должно выскочить по очереди 20 сообщений с содержимым каждой строки.
только как это реализовать что то не понял...

11 (изменено: jite, 2010-12-22 00:45:39)

Re: CMD/VBS: Добавление символов в строку и сохранение rtf в txt

... (обсуждалось на http://forum.script-coding.info)
Тема закончилась следующим:

'-----------------------------------------------------------------------------------------------------------------------
' 14.12.2010
' Конвертор rtf в txt с выборочным преобразованием текста
' Перебирает файлы папки sInFolderName, в подпапках не ищет. Все найденные файлы с расширением rtf пытается открыть и 
' при успехе преобразует в txt с кодировкой CP866 (DOS), сохраняя их с теми же именами в папку sOutFolderName 
' (имеющиеся файлы молча перезаписывает)
' 
' Папки sInFolderName и sOutFolderName находятся в одной папке с запускаемым скриптом
' 
' Дополнительные преобразования текста: 
'   убирает пустые строки
'   заменяет вхождения строк массива aPatterns на строки массива aReplaces
'-----------------------------------------------------------------------------------------------------------------------
option explicit

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

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

const wdFormatText = 2
dim i
dim aPatterns : aPatterns = Array("(RD1\|[^\|]+\|[^\|]+\|)", "(RD2\|[^\|]+\|[^\|]+\|)", "(RD3\|[^\|]+\|[^\|]+\|)")
dim aReplaces : aReplaces = Array("$120|", "$130|", "$131|")
if UBound(aPatterns) <> UBound(aReplaces) then 'антиглупин
  WScript.Echo "Число масок поиска aPatterns не соответствует числу замен aReplaces - надо исправить!" & _
    " (ничего не сделано)"
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("Word.Application")
  for each oFile in oInFolder.Files
    dim re : set re = CreateObject("VBScript.RegExp")
    re.Pattern = "\.rtf$"
    re.IgnoreCase = true
    if re.Test(oFile.Path) then 'файл оканчивается на ".rtf"
      dim sText
      dim sFileOut : sFileOut = sOutFolderPath & "\" & re.Replace(oFile.Name, ".txt") 'Результат
      
      on error resume next
      with oW.Documents.Open(oFile.Path)
        ' oW.Visible = true 'если хотим полюбоваться мельканием окошек
        oW.Selection.WholeStory
        sText = oW.Selection.Text
        
        'избавляемся от пустых строк
        re.Pattern = "(^\s*$)+(^.)"
        re.Global = true
        re.Multiline = true
        sText = re.Replace(sText, "")
        'RD-замены
        for i = 0 to UBound(aPatterns)
          re.Pattern = aPatterns(i)
          sText = re.Replace(sText, aReplaces(i))
        next
        
        oW.Selection = sText 'вставляем измененный текст взамен прежнего
        with oW.Selection.ParagraphFormat 'убираем отступы форматирования, чтобы они не стали в txt пробелами
          .LeftIndent = 0
          .RightIndent = 0
          .SpaceBefore = 0
          .FirstLineIndent = 0
        end with
        .SaveAs sFileOut, wdFormatText, , , , , , , , , , 866
        .Close
      end with
      if Err then
        WScript.Echo "Ошибка при работе с '" & oFile.Name & "'  " & Err.Number & " " & Err.Description
      end if
      on error goto 0
    end if 'файл оканчивается на ".rtf"
  next
  oW.Quit
  set oW = Nothing
else
  WScript.Echo "Не нашлось входной ('" & sInFolderPath & "') или выходной ('" & sOutFolderPath & _
    "') папок.  (ничего не сделано)"
end if 'есть все нужные папки

'Синтаксис на память:
' Sub SaveAs([FileName], [FileFormat], [LockComments], [Password], [AddToRecentFiles], [WritePassword], [ReadOnlyRecommended], [EmbedTrueTypeFonts], [SaveNativePictureFormat], [SaveFormsData], [SaveAsAOCELetter], [Encoding], [InsertLineBreaks], [AllowSubstitutions], [LineEnding], [AddBiDiMarks])