2016-03-13 3 views
1

У меня есть простая задача, взять текстовый файл и дублировать каждое слово в текстовом файле. Так что, если текстовый файл был «Я люблю блины», мой выход должен быть «Я люблю блины для блинов»Лучший инструмент для создания сценариев Windows

Я пробовал использовать Word 2013 и VBA. Вот мой код:

Sub HLSConvert() 
    Set docNew = Documents.Add 
    Set origDoc = Documents.Open("c:\test\AllWords.txt") 
    Dim r As String 
    For Each sentence In ActiveDocument.StoryRanges 
     For Each W In sentence.Words 
      r = W + W 
      docNew.Content.InsertAfter r 
      DoEvents 
     Next 
    Next 
End Sub 

К сожалению, VBA ДЕЙСТВИТЕЛЬНО медленный. Текстовые файлы, над которыми я работаю, составляют тысячу страниц, и для VBA требуется 2 часа для дублирования большого файла. Поэтому я надеюсь, что кто-то здесь может помочь. Есть ли лучший инструмент \ язык, который я могу использовать для достижения этого? Или может кто-то предложить улучшения моего кода VBA для ускорения процесса?

+0

Предложения: Не используйте ActiveDocument - Word всегда необходимо вычислить, который является ActiveDocument. Вы установили переменную в два документа, вместо этого используйте этот объект (origDoc). Объединение измененного содержимого в строку, а не запись его обратно в документ (docNew) в цикле. Каждый раз, когда вы обращаетесь к объекту, он медленнее. Запишите всю строку в документ, как только вы закончите. Полностью используйте объектную модель, вместо того, чтобы VBA угадать, что вы имеете в виду: r = r & W.Text & W.Text (обратите внимание на & вместо +). Вы уверены, что вам нужны DoEvents? –

+0

Не открывайте файл txt в Word как документ Word. Используйте FSO и TextStream для их обработки. Вы также можете сделать это из файла VBS, а затем вам вообще не нужен MS Office для этой задачи. Google - ваш друг. :) – vacip

+0

'r = r &" "& W &" "& W' –

ответ

1

Существует пример кода на основе RegEx для дублирования слов. Он не требует установки MS Office, вы можете использовать его как скрипт WSH VB, сохраненный в файле .VBS. Также он работает в среде VBA.

Sub WordsDuplicate(strSource, strTarget) 
    ' strSource - full path to the source text file 
    ' strTarget - full path to the target text file 
    With CreateObject("Scripting.FileSystemObject") 
     If .FileExists(strSource) Then 
      ' read source text file 
      With .OpenTextFile(strSource, 1, False, 0) ' -2 - System default, -1 - Unicode, 0 - ASCII 
       strCont = "" 
       If Not .AtEndOfStream Then strCont = .ReadAll 
       .Close 
      End With 
      ' duplicate 
      With CreateObject("VBScript.RegExp") 
       .Global = True 
       .MultiLine = True 
       .IgnoreCase = True 
       .Pattern = "(\b\w+\b)" 
       strRes = .Replace(strCont, "$1 $1") 
      End With 
      ' write target text file 
      With .OpenTextFile(strTarget, 2, True, 0) 
       .Write (strRes) 
       .Close 
      End With 
      t3 = timer 
     End If 
    End With 
End Sub 

Я взял в качестве примера текст, содержащий 572614 слов, размер файла 3.11 MB, ANSI charset. Тайминги результата: чтение исходного текстового файла 180 мс, дублирование 320 мс, запись целевого текстового файла 39 мс. Всего около 540 мс.

Смежные вопросы