Авторские статьи

Подсчёт суммарного количества знаков во множестве документов docx.


Мой друг не нашёл решения на свой вопрос и обратился ко мне с просьбой - а как подсчитать суммарное количество знаков во множестве документов docx?

Мне показалась задача интересной и решил сваять PowerShell скрипт, который поможет реализовать задуманное. Не являюсь хейтером PowerShell и считаю его отличным инструментом для ИТ специалистов, тем более для админов и точно обязателен к изучению и освоению админами MS Windows платформ. По умолчанию в современных MS Windows уже доступен PowerShell, но по желанию новые версии Мощной Оболочки для различных операционных систем можно взять на сайте проекта https://aka.ms/powershell

В целях безопасности MS Windows по умолчанию не разрешает выполнение непонятных скриптов, что логично. Возможно, вам придётся однократно запустить оболочку с правами Администратора и выполнить Set-ExecutionPolicy RemoteSigned. Чтение zip архивов без распаковки system.io.compression.filesystem требует современных PowerShell и .Net Framework 4.5 или новее.

Общий алгоритм следующий:
1) Берём только docx файлы. Так как docx это формально zip архив с XML внутри. Doc - это закрытый бинарный формат, который не обрабатывается скриптом. Если вам необходимо обсчитать doc, то придётся или пересохранить их в docx или найти другое решение.
2) Читаем docx файл как "XML документ внутри ZIP архива без распаковки".
3) Убиваем все XML теги.
4) Подсчитываем длину оставшегося.
5) Суммируем в итоге и выдаём результат.

Сам скрипт можно скачать в архиве zip, чтобы браузеры не ругались при скачивании PowerShell скриптов ps1.

PowerShell script counts the number of characters in multiple docx files.


Add-Type -assembly "system.io.compression.filesystem"
Write-Host $PSScriptRoot
$overall_size = 0
Get-ChildItem -Path $PSScriptRoot -Recurse -Filter *.docx | Foreach-Object {
   $zip = [io.compression.zipfile]::OpenRead($_.FullName)
   $file = $zip.Entries | where-object { $_.Name -eq "document.xml"}
   $stream = $file.Open()
   $reader = New-Object IO.StreamReader($stream)
   $text = $reader.ReadToEnd()
   $text = $text -replace '<[^>]+>',''
   Write-Host $_.FullName - $text.Length
   $overall_size = $overall_size + $text.Length
   $reader.Close()
   $stream.Close()
   $zip.Dispose()
}
Write-Host Total number of characters including spaces $overall_size
Write-Host "Press any key to continue ....."
[void][System.Console]::ReadKey($true)

Разместите скрипт CountChars.ps1 в каталоге с документами docx и правой клавишей вызовите контекстное меню где укажите запустить с помощью PowerShell. Скрипт будет обходить рекурсивно каталоги и все docx файлы будут обработаны.

Дата последней правки: 2022-05-14 08:32:17

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта