Показать полную графическую версию : Вырезать начало/ заголовок файла до определённого символа
Уважаемые, здравствуйте!
В этой теме (http://forum.oszone.net/post-2963454.html), пользователь задавался вопросом замены одной последовательности символов на другую.
Там же (http://forum.oszone.net/post-2963563-22.html) была предложена утилита sfk (https://sourceforge.net/p/swissfileknife/wiki/Documentation/?version=2), которая мгновенно выполняла запрошенное.
В моём случае конечно не принципиально, чтобы использовалась именно данная утилита, полагаю подойдет и powershell-сценарий, но признаться честно объём файлов большой.
Описание:
Имеется большое количество файлов, которые на протяжении многих лет создавались в одном из "самописных" приложений, которое естественно уже кануло в лету.
По факту это *.djvu файл со вставкой в заголовок сведений о сертификате/ подписи.
Мне нужно этот заголовок удалить (например все данные до "AT&TFORM") и изменив расширение "превратить" файл в валидный *.djvu для дальнейшего открытия/ просмотра.
Может кто располагает готовым решением или подскажет по теме?
Образец файла прикрепляю.
А во всех файлах в заголовках одинаковое количество символов? Или там заголовки разные?
И ещё, в конце файла тоже присутствует какая-то информация - она мешать не будет?
А во всех файлах в заголовках одинаковое количество символов? Или там заголовки разные? »
Количество разное, обрезка вровень до "AT&TFORM" превращает файл в открываемый *.djvu;
И ещё, в конце файла тоже присутствует какая-то информация - она мешать не будет? »
Этот "шум"/ мусор, открытию файла, не мешает ))
Количество разное »
Было бы проще, если бы было одинаковое...
Ну да ладно. Примерно так:
param (
[string]$folder = '.\TEST',
[string]$tmpl = 'AT&TFORM'
)
function RW-Stream {
param (
[Parameter(ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
$filein,
$fileout = 'tmp.tmp',
$template
)
begin {
new-variable -name block -val 524288
$buf = new-object byte[] ($block)
}
process {
$flag = $true
$reader = [io.streamreader]::new($filein.fullname)
$writer = [io.streamwriter]::new($fileout)
new-variable -name tblock -val 1
$tbuf = new-object byte[] ($tblock)
while ($reader.basestream.position -lt $reader.basestream.length -and $flag){
$null = $reader.basestream.read($tbuf,0,$tblock)
if ([char][int]$tbuf[0] -eq $template[0]){
$pos = $reader.basestream.position - 1
$i,$flag1 = 1,$true
while ($flag1 -and $i -lt $template.length){
$null = $reader.basestream.read($tbuf,0,$tblock)
if ([char][int]$tbuf[0] -eq $template[$i]){
if ($i -eq $template.length-1){
$flag,$flag1 = $false,$false
$reader.basestream.position = $pos
}
} else {$flag1 = $false}
$i++
}
}
}
rv tbuf;rv tblock
while ($reader.basestream.position -lt $reader.basestream.length){
$cnt = $reader.basestream.read($buf,0,$block)
$writer.basestream.write($buf,0,$cnt)
}
$reader.dispose();$writer.dispose()
$reader.close();$writer.close()
# Если создавать новые файлы не требуется, то исходные файлы будут
# перезаписаны новыми:
#mi $fileout $($filein.fullname) -force
# Если необходимо переименование в .djvu, то строка выше должна быть
# закомментирована, а последующая раскомментирована. Создаются файлы
# с таким же именем, но с расширением djvu. Исходные файлы не изменяются:
mi $fileout $($filein.fullname -replace '\..*$','.djvu') -force
}
}
dir $folder -file -rec |rw-stream -templ $tmpl
Спасибо!
Проверил на образце - заголовок отрезает!
Файл в программе просмотра *.djvu открывается корректно.
В ближайшие, рабочие, дни запущу сценарий на наборе файлов.
Проверил на образце - заголовок отрезает! »
Код немного поправил, а то по шаблону, фактически, проверялся только первый и последний символ...
Не стал затягивать и выполнил на наборе из ~97 тыс. файлов - сценарий управился за ~17 минут.
Проверил выборочное открытие файлов - открытие успешное.
YuS_2, ещё раз выражаю благодарность!
Код немного поправил, а то по шаблону, фактически, проверялся только первый и последний символ... »
Спасибо!
Отработал по первому варианту, как Выше и написал - выборочное открытие файлов проблем не выявило.
UPD:
Но, Я всё же поищу проблемные файлы и напущу на них исправленный вариант сценария.
Да, действительно, такие файлы нашлись, и последний вариант сценария обрабатывает их правильно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.