Объедините 70000 файлов RTF / DOC в один

3298
Andrew

Я хочу объединить 70 000 файлов RTF и DOC в один.

Я попытался использовать Microsoft Word 2010 и выполнить команду «Вставить» → «Объект» → «Текст из файла», но у него есть некоторые ограничения, поскольку он не объединяет более пары десятков файлов, независимо от того, сколько вы выберете ,

Существуют ли какие-либо (желательно с открытым исходным кодом) утилиты, которые могут сравнительно быстро объединять такое количество файлов?

2
Я бы сказал, автоматизировать задачу, используя VBA или что-то в этом роде. Сам я бы выбрал либо это, либо инструмент AutoIt, который, вероятно, даст быстрый и грязный сценарий из десяти строк для повторения ручной операции вставки объекта. minya 12 лет назад 0
Хорошо, плохие новости, поскольку я не обладаю какими-либо конкретными навыками программирования :) Не могли бы вы / кто-нибудь еще помочь написать макрос, исполняемый под Windows 7 64-bit / MS Word 2010? Я не новичок, но я сам не занимался программированием на VBA. В основном файлы находятся в ОДНОЙ папке в формате 1.rtf, 2.rtf, ... Andrew 12 лет назад 0

2 ответа на вопрос

3
minya

Ну вот. В настоящее время я по колено в AutoIt, поэтому я использовал это. Вы можете получить сам инструмент на autoitscript.com.

Заметки:

  • Я связал Ctrl + Shift + I с командой Word InsertFile, вы должны сделать то же самое, чтобы скрипт работал. Google это или посмотрите на StackExchange.

  • Сценарий работает исходя из предположения, что пустой документ уже открыт в MS Word и что существует только одно окно MS Word.

  • Измените значение $ locationOfRtfFiles в соответствии с вашими настройками. Он должен указывать на папку, содержащую RTF.

  • Интервал ожидания может потребовать корректировки (зависит от производительности вашего компьютера и размера / сложности файлов RTF)

Код (чуть более 10 строк, но будем надеяться, что никто не считает):

; Some common sense stuff, look it up in the docs AutoItSetOption("TrayIconDebug", 1) AutoItSetOption("MustDeclareVars", 1) ; Tell AutoIt to match the substring anywhere in the window title AutoItSetOption("WinTitleMatchMode", 2)  ; find a window by title and some contained text (optional), ; make it active and wait for the window to become ; active Func MyWinWait($title, $keytext = "") WinWait($title, $keytext) WinActivate($title, $keytext) WinWaitActive($title, $keytext) Return EndFunc  Local $locationOfRtfFiles = "C:\MyCollectionOfRtfPorn"  ; for every file in the set For $fileIndex = 1 to 70000 ; focus on the main Word window MyWinWait("Microsoft Word")  ; emulate Ctrl+Shift+I Send("i")  ; wait for the Insert File window to open MyWinWait("Insert File") ; type out a file's name Send($locationOfRtfFiles & "\" & $fileIndex & ".rtf") ; confirm selection Send("")  ; sleep for 10 seconds before proceeding to next file Sleep(10000) Next 

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

1) Большое спасибо! Спасибо больше, работает! Я тоже русская! (/ Большое спасибо, это работает. Я тоже русский /) 2) Это красиво, но немного примитивно, и, как только вы ложитесь спать в течение 1 секунды, реального эффекта нет. То есть => это медленно. Что является главной слабостью этого сценария. Но я впечатлен, и это рабочее решение :) Я знаком с "Macro Expert", поэтому мне интересно, как можно ускорить этот скрипт, до менее 1 секунды на файл. В противном случае я смотрю на дни слияния. Andrew 12 лет назад 0
Андрей, пожалуйста. Проблема с сокращением времени ожидания заключается в том, что AutoIt (в данном случае) не имеет надежного способа узнать, что вставка завершена. Конечно, у сценария VBA такой проблемы не будет, поэтому я выложил для вас готовый пример :) http://blogs.technet.com/b/heyscriptingguy/archive/2005/05/03/how-can -i-insert-files-into-a-word-document.aspx Я считаю, что это должно работать на максимальной скорости, достижимой с помощью InsertFile. Другой подход может повысить производительность, но я искренне надеюсь, что вам не нужно регулярно объединять 70 тыс. RTF. :) minya 12 лет назад 0
Последний фрагмент кода на этом сайте работает нормально, НО он не принимает файлы в том порядке, в каком они упорядочены в каталоге. Вместо 1.rtf, 2.rtf требуется 1.rtf, затем 10321.rtf и т. Д. Можно ли это как-то исправить? Спасибо :) Andrew 12 лет назад 0
http://stackoverflow.com/questions/5417979/batch-rename-sequential-files-by-padding-with-zeroes (используйте пакетный сценарий из этого Вопроса; требуется небольшая адаптация) minya 12 лет назад 0
1
Cokal

Если вы используете ОС Unix, используйте следующее:

textutil -cat rtf *.rtf *.doc -output combinedFiles.rtf 
Я думал, что .doc, .rtf и почти любой формат документа Microsoft имеет заголовок, а результирующий файл должен иметь только один заголовок? LawrenceC 12 лет назад 1
Я нахожусь на Windows 7, как отмечалось выше, так что, к сожалению, это не решение. Andrew 12 лет назад 0
Команда `textutil` не существует в большинстве систем Unix. Это на MacOSX, и, вероятно, на других системах, основанных на BSD, но не на Ubuntu, CentOS, Solaris или Cygwin. Keith Thompson 12 лет назад 0