Страница 1 из 1
Объединение файлов попарно, исходя из их размера
Добавлено: Ср янв 11, 2012 16:25
DocWeb
Приветствую всех.
Возникла необходимость в автоматизации следующей задачки.
В панели ТС отсортированные по размеру файлы.
Необходимо объединить их попарно, самый большой (первый) с самым маленьким (последний).
Результат логично после объединения переместить в другой каталог (выделенный в другой панели ТС или заданный через параметры).
Пожелание. При объединении файлов добавлять произвольный постоянный текст (например "--разрыв файла--" или иной) между содержимым объединенных файлов.
Файлы текстовые, имена разные, расширение txt, число файлов в папке будет четное, объединять нужно все файлы.
Файл получаемый может иметь имя любого из объединенных, не критично.
Спасибо.
Добавлено: Ср янв 11, 2012 18:25
Flasher
DocWeb писал(а):самый большой (первый) с самым маленьким (последний)
Только первый и последний или каждый убывающий до середины с каждым возрастающим до середины?
И для чего такая странная задача требуется?
Добавлено: Ср янв 11, 2012 19:30
DocWeb
да, каждый убывающий и каждый возрастающий, до середины.
задача - есть куча файлов с текстами.
нужно сделать их примерно одинакового размера все. не теряя смысла и целостности самого содержимого в каждой части.
файлов тысячи. вручную объединять совсем утомительно...
Добавлено: Ср янв 11, 2012 21:03
Avada
DocWeb
Действительно, странная задача, и я тоже не понимаю — зачем. Что, размер файлов — самоцель? Ну, было тысяча, объединили тексты произвольно по парам, стало пятьсот и более близкого размера — и что? Как, например, потом искать, что в какую пару попало?
Добавлено: Ср янв 11, 2012 21:30
DocWeb
Есть куча файлов с размером от 500 до 1кб.
итоговый файл не должен быть менее 1.5кб.
все более крупные уже были отобраны до этого.
каждый файл - некий текст, новость например, анекдот или еще что-то.
главное - результирующий файл не должен быть менее 1.5кб.
если объединять попарно могут быть и 1кб (2 по 500) и 2кб (1+1кб).
т.е. можно просто попарно пообъединять, потом опять отобрать меньше 1.5 и опять их попарно... не спорю.
но я все равно не знаю автом.решения такой задачи.
потому и спрашиваю. может кто поможет...
Добавлено: Чт янв 12, 2012 05:25
Flasher
DocWeb
Исходная цель так и не была названа.
Я иду в продуктовый, чтобы запастись продуктами для приёма пиши, а не для раскладывания этих продуктов по полочкам холодильника.
Нужно ответить на следующие вопросы:
1) Зачем нужны приблизительно равные по размеру файлы? Какая от этого польза?
2) Почему нужно объединять именно попарно, а не по четыре, по шесть и т.д.?
3) Какова реальная тематика содержимого объединяемых файлов?
4) Зачем требуется указывать место склейки? Что это даст?
И разделитель лучше какой: текст или пустая строка + текст + пустая строка ?
Добавлено: Чт янв 12, 2012 08:17
DocWeb
Flasher
есть архив оффлайн-газеты. нужно его, архив выложить на сайт. архив представляет собой огромное количество текстовых файлов, 1 файл = 1 заметке/новости.
требование - размер статьи должен быть не 1.5кб. все статьи/заметки что больше этого размера отобраны уже.
остальные (меньше 1.5) и остались необработанными.
так как статьи/заметки имеют размер от 100 байт до 1499, то объединение самого маленького и самого большого заведомо будет более 1.5.
если объединять больше файлов - теряется читаемость и удобство.
новостная тематика. примерно такого вот плана.
"31 ноября. Мер встретился с горожанами.
Сегодня наш мер провел запланированную встречу....."
место склейки потом будет преобразовано, если сразу нельзя в конструкцию вида
- чтоб раздвинуть новости друг от друга на один абзац, для удобства читаемости.
разделитель любой, но оптимально
Добавлено: Чт янв 12, 2012 09:19
Flasher
Вот это уже более менее понятно.
Можно не выделять и не сортировать:
Код: Выделить всё
'=====================================================================
' Попарное склеивание убывающих и возрастающих по размеру файлов
' Если выбран только один файл, то участвуют
' все текстовые файлы корня активной панели
' Параметры %L "%P" "<Путь получателя>" <расширение файлов>
' Пример: %L "%P" "%T" txt
' Автор - Flasher ©
'=====================================================================
With WScript.Arguments
If .Count = 0 Then WScript.Quit
List = .Item(0) : Path = .Item(1)
Targ = .Item(2) : Ext = .Item(3)
End With
If Right(Targ, 1) <> "\" Then Targ = Targ & "\"
L = vbNewLine
Set FSO = CreateObject("Scripting.FileSystemObject")
Mass = Split(FSO.OpenTextFile(List, 1).ReadAll, L)
Max = Ubound(Mass)
If Max = 1 Then
For Each F in FSO.GetFolder(Path).Files
If StrComp(Ext, FSO.GetExtensionName(F), 1) = 0 Then S = S & F & L
Next
Mass = Split(S, L) : Max = Ubound(Mass)
End If
If Max Mod 2 Then
MsgBox "Необходимо выбрать чётное число файлов!", 48,_
Space(32) & "Склеивание файлов" : Quit
End If
Set Dict = CreateObject("ADODB.Recordset")
Dict.Fields.Append "Name", 200, 255
Dict.Fields.Append "Size", 3 : Dict.Open
For Each F In Mass
If F <> "" Then
If Not FSO.FileExists(F) Then
MsgBox "Снимите выделение с каталогов!", 48,_
Space(22) & "Склеивание файлов" : Quit
End If
Dict.AddNew : Dict("Name") = F
Dict("Size") = CLng(FSO.GetFile(F).Size) : Dict.Update
End If
Next
Dict.Sort = "Size DESC"
Sort = Split(Dict.GetString, vbCr)
For i = 0 to Max/2 - 1
Str1 = Sort(i) : N1 = Left(Str1, InStrRev(Str1, vbTab) - 1)
Str2 = Sort(Max-i-1) : N2 = Left(Str2, InStrRev(Str2, vbTab) - 1)
FSO.OpenTextFile(Targ & FSO.GetFileName(N1), 2, True, -2).Write _
FSO.OpenTextFile(N1,,,-2).ReadAll & L & "<p></p>" & _
L & FSO.OpenTextFile(N2,,,-2).ReadAll
Next : Quit
Sub Quit : Set FSO = Nothing : Set Dict = Nothing : WScript.Quit
End Sub
Добавлено: Чт янв 12, 2012 11:01
DocWeb
Flasher
спасибо! работает. уже второй раз мне помогаете.