как "склеить" текстовые файлы?

Компьютерные отцы!

Выручайте советом. Задача такая: нужно "слить" кучу текстовых файлов (txt) в один текстовый файл (тоже txt). Какой прогой ее можно решить? Раньше (при небольшом количестве файлов) я решал такие задачи вордовским макросом. Помню, с какими тормозами он работал. Но сейчас число txt-файлов, которые нужно объединить, порядка 30.000. 🙂 Боюсь, что никакой макрос не справится. Что делать?

Написать комментарий...
Sat_Abhava
17 years ago

Я вот тут на одном форуме вычитал, что старый добрый DOS эту задачу решить может. Что-то вроде:

copy 1.file+2.file=3.file

Может кто подскажет, какой должна выглядеть командная строка, чтобы у меня все txt-файлы в директории в один txt-файл слились? 🙂 Уж простите ламера за столь наивные вопросы... 😆

Ответить
Echter
17 years ago

Когда-то мне приходилось объединять сотни, или даже тысячи, текстовых файлов с помощью вордовского макроса, и всё было без проблем.
Синтаксис досовской строки прост:
copy /b FILE1.txt + FILE2.txt + ... + FILExyz.txt DESTINATION.txt
Ключ /b после команды означает бинарное соединение файлов, если же на выходе надо получить текст в ASCII, используется ключ /a (вообще-то в данном случае он, наверное, не нужен).
В Вашем случае, очевидно, лучше поместить файлы в одну папку (скажем, ALLFILES) и воспользоваться строкой типа:
copy /b ALLFILES DESTINATION.txt
Тогда все файлы в папке, по идее, должны объединиться в один под названием DESTINATION.txt

Ответить
Papa HuHu
17 years ago

скачай программу total commander - она и так по жизни ОЧЕНЬ пригодится, а также в меню файл у нее есть опция Combine Files...

тотал командер это как виндовз эксплорер только в 100 раз полезнее!

Ответить
MiR
17 years ago
скачай программу total commander - она и так по жизни ОЧЕНЬ пригодится, а также в меню файл у нее есть опция Combine Files...

Софтина лучшая, это несомненно. Есть одно "но". Опция Combine Files предназначена для немного другой операции - коммандер умеет бить большие файлы на куски (чтобы, например, потом можно было распихать его по дискетам), а Combine Files как раз нужна, чтобы потом на новом месте этот файл склеить обратно по кусочкам и сверить CRC с исходной. Но ПапаХуха прав, в твоем случае ее тоже можно использовать, только с одной оговоркой: тебе нужно все файлы пронумеровать. Т.е. имя каждого файла должно выглядеть так:.txt, тогда коммандер поймет, в каком порядке склеивать файлы воедино.

Комментарии к сказанному:
1) коммандер изначально склеивает в двоичном, а не текстовом режиме, так что можешь не беспокоиться, никакие ключи /b не нужны;
2) нужно вставить ведущие нули (в твоем случае должно быть не меньше пяти разрядов, иначе сортировка будет неправильной), т.е. файлы будут такого вида: file00001.txt, file00002.txt, ..., file30000.txt;
3) переимновывать файлы можно там же в коммандере с помощью отличной опции - Multi-Rename Tool (Ctrl-T) - один раз разберешься и заценишь навсегда! 😁

Досявая команда "copy f1.txt+f2.txt+...fn.txt all.txt" была бы полезна, но при меньшем количестве файлов, т.к. длина командной строки DOS ограничена, кажется, 256-ю символами... Как говорится, делай выводы. 😞

Что касается команды вида "copy allfiles destination.txt", то она будет понята буквально, т.е. первый файл будет скопирован в эту же папку под именем destination.txt, а каждый последующий будет пытаться его перезаписать, а не добавиться в конец. При каждой попытке перезаписи дос, ясное дело, у тебя будет спрашивать: "overwrite или сам понял, что не катит?" 😁) Если же существует директория destination.txt, то в нее все файлы сольются с теми же именами и в том же количестве. Так что вариант с досом не проходит никак.

Любители истории могут еще вспомнить, что была в досе такая штука - append... Сразу говорю, к дозаписи в конец файлов она отношения не имела 😆

Удачи! 😉

Ответить
Echter
17 years ago
... Если же существует директория destination.txt, то в нее все файлы сольются с теми же именами и в том же количестве. Так что вариант с досом не проходит никак....

Хотя я и был уверен в результате, на всякий случай ещё раз проверил: создал около тысячи небольших текстовых файлов и склеил их в ДОСе командой типа "copy ALLFILES DESTINATION.txt"
Всё прекрасно работает, и как выяснилось, даже без ключа /b !
Та проблема, о которой Вы говорите, возникает только если пользоваться командой "xcopy".

Ответить
Sat_Abhava
17 years ago

Спасибо огромное всем, кто откликнулся и подкинул пищу для размышлений. После недолгого экспериментирования методом научного тыка, добился необходимого результата досовской командой:

COPY *.TXT ALL.TXT

Все файлы скопировались в файл результата (ALL.TXT).

Ответить
MiR
17 years ago
Все файлы скопировались в файл результата (ALL.TXT).

Echter, Sat! Рассказывайте! Под какой операционкой происходило сие действо🙄

Сат, а порядок, в котором файлы склеивались, был важен? Таким способом они должны были слиться в том порядке, в котором они хранятся в записях файловой системы. Сортировка никакая не применяется. Ты результат проверил на предмет соответствия желаемому?🙂

Ответить
MiR
17 years ago
Хотя я и был уверен в результате, на всякий случай ещё раз проверил: создал около тысячи небольших текстовых файлов и склеил их в ДОСе командой типа "copy ALLFILES DESTINATION.txt"
Всё прекрасно работает, и как выяснилось, даже без ключа /b !..

Ага, есть контакт! Под 2К тоже работает. Правда, есть два момента:
1) порядок склеивания (естественно) сомнительный;
2) если не использовать ключ /b, то в конце файла добавляется символ с кодом 26 (1Ah), т.е. старый, добрый Ctrl-Z 😆

Ответить
MiR
17 years ago
Хотя я и был уверен в результате, на всякий случай ещё раз проверил: создал около тысячи небольших текстовых файлов и склеил их в ДОСе командой типа "copy ALLFILES DESTINATION.txt"
Всё прекрасно работает, и как выяснилось, даже без ключа /b !..

Ага, есть контакт! Под 2К тоже работает. Правда, есть два момента:
1) порядок склеивания (естественно) сомнительный;
2) если не использовать ключ /b, то в конце файла добавляется символ с кодом 26 (1Ah), т.е. старый, добрый Ctrl-Z 😆

Ответить
Sat_Abhava
17 years ago
Echter, Sat! Рассказывайте! Под какой операционкой происходило сие действо🙄

Сат, а порядок, в котором файлы склеивались, был важен? Таким способом они должны были слиться в том порядке, в котором они хранятся в записях файловой системы. Сортировка никакая не применяется. Ты результат проверил на предмет соответствия желаемому?🙂

Рассказываю. 🙂

На машине с русским Винд 98 перезагрузился в режиме MS-DOS. КомандойCD полный_путь_к_папке_с_файламизашел в папку, командойCOPY *.TXT A00000.TXTпереписал все файлы в файл A00000.TXT . Файлы в папке хранились под именами от a00001.txt до a04808.txt (пока сделал первую часть задуманного 🙂😉. "Пережевывал" ДОС все это дело минут 20, демонстрируя имена файлов один за одним, проследить проблем не составило. Правда, последним он почему-то записал еще и сам a000000.txt (последним в списке, изначально его в папке не было) и выдал 3 сообщения, что"содержимое результирующего файла утрачено до копирования".

Открыл результат, бегло проверил первую и последнюю строки (присутствуют), пять произвольно взятых отрывков (повторов не обнаружено). Полагаю, что все ОК.

Ответить
quaxter
17 years ago
тотал командер это как виндовз эксплорер только в 100 раз полезнее!

Если забыть о том, что в тотал командере ограничена поддержка Юникода в именах файлов настолько, что злые языки поговаривают о ее отсутствии.
Я вот вынужден пользовать, к примеру, архиватор 7-zip в качестве дополнительного к тотал командеру файл-менеджера.
Почему-то детище Игоря Павлова оказалось абсолютно бесплатным и лишено недостатка творения Кристиана Гислера 🙂
А клеить текстовые файлы досовскими командами под вынь2кило не пробовал. А надо бы 🙂

Ответить
Echter
17 years ago
...На машине с русским Винд 98 перезагрузился в режиме MS-DOS. Командой CD полный_путь_к_папке_с_файлами зашел в папку, командой COPY *.TXT A00000.TXT переписал все файлы в файл A00000.TXT . Файлы в папке хранились под именами от a00001.txt до a04808.txt (пока сделал первую часть задуманного 🙂😉. "Пережевывал" ДОС все это дело минут 20, демонстрируя имена файлов один за одним, проследить проблем не составило. Правда, последним он почему-то записал еще и сам a000000.txt (последним в списке, изначально его в папке не было) и выдал 3 сообщения, что "содержимое результирующего файла утрачено до копирования". ...

Да, это интересно. Чего только, оказывается, в ДОСе нет! А чтобы a000000.txt не копировался сам в себя, его, очевидно, надо помещать в другую папку и, соответственно, указывать полный путь при копировании.

Ответить
Sat_Abhava
17 years ago
А чтобы a000000.txt не копировался сам в себя, его, очевидно, надо помещать в другую папку и, соответственно, указывать полный путь при копировании.

Да, полагаю, что имеенно в этом и дело. Впрочем, ничего страшного не произошло. 🙂

Я тут по ДОС-у интересный справочник в сети нашел. Если кому надо, то обращайтесь: http://www.citforum.ru/operating_systems/msdos/index.shtml

Ответить
quaxter
17 years ago
Да, это интересно. Чего только, оказывается, в ДОСе нет! А чтобы a000000.txt не копировался сам в себя, его, очевидно, надо помещать в другую папку и, соответственно, указывать полный путь при копировании.

Погодите, друзья, я совершенно случайно на SourceForge наткнулся на прогу/проект merge.
ДОС - это, конечно, страна сказочных чудес, но означенная прога позволяет под виндой проделывать что-то очень похожее на описанную в треде процедуру.
Постараюсь за сутки чуть разгрузившись разобраться с этой прогой, а потом выложу здесь же аннотацию и отзыв.

Ответить
quaxter
17 years ago

Отцы, простите ламера позорного...
WinMerge, о которой я писал - это программерско-девелоперская прога для обнаружения изменений и синхронизации версий составных элементов программного проекта для сборки на компиляцию. То есть хедера, заголовки, основные модули и проч. синхронизовывать. Для заявленной Сат Абхавой цели программа явно не годится...
Удаляюсь в уединенную келью в совершенном смущении для отбития массы поклонов... 😞

Ответить