Я сделал скрипт для Windows Powershell и сохранил его как файл .ps1. Я создал его следующим образом:
$linecount = 0
$editfilenumber = 1
$endfilenumber = 1
$totallines = 0
$i = 0
$interval = 100 / 1
Эта часть просто для сброса всех основных переменных.
$linecount
используется для количества линий, созданных в новых частях (об этом поговорим позже). $editfilenumber
используется для номера редактируемого файла (удалены дубликаты, удалены инвалиды ...). $endfilenumber
используется для созданного номера детали. $totallines
используется для общего количества строк. $i
используется для расчета процентов. $interval
используется для интервала обновления индикатора выполнения (в противном случае процесс будет очень медленным)
$srcdirectory = Read-host "Select path to the source folder"
$partdirectory = Read-host "Select path to where the parts need to be stored"
$maxlines = Read-host "How many lines are in the new parts?"
$maxsize = [int]$maxlines
$partname = Read-host "How do you want the new parts to be called?"
Это в основном запрашивает у пользователя данные и количество строк в деталях.
$files = Get-ChildItem $srcdirectory -filter *.txt
Write-Host "These files will be edited and combined: "
$files | format-table name
Это перечислит все файлы .txt в данном каталоге. Это сделано для того, чтобы пользователь знал, какие файлы будут использоваться.
Write-Host "Press any key to continue..." -foregroundcolor "green"
$HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL
$HOST.UI.RawUI.Flushinputbuffer()
Это ожидает подтверждения пользователя, ожидая нажатия клавиши.
$start = Get-Date
Получает текущую временную метку для расчета времени обработки в конце.
ForEach ($file in $files) {
Write-host "Editing file: " $file
Write-host "Loading list..."
$list = Get-content $srcdirectory\$file
Write-host "OK" -foregroundcolor "green"
Write-host "Removing duplicates..."
$list = $list | Get-Unique
Write-host "OK" -foregroundcolor "green"
Write-host "Removing invalid..."
$list = $list | Where { $_ -notmatch "^@" } | Where { $_ -match "@" }
$list = $list -replace ';', ':' | Where {$_ -notmatch ':[^\)]+:'} | Where {$_ -notmatch '::'}
Write-host "OK" -foregroundcolor "green"
Write-host "Combining lists..."
$longlist = $longlist + $list | Get-Unique
$editfilenumber ++
Write-host "Success!" -foregroundcolor "green"
}
Эта часть довольно важна. Во-первых, он отображает, какой файл редактируется, и создает $list
содержимого этого файла. После этого он получает все уникальные строки (и, таким образом, удаляет дубликаты), удаляет недопустимые строки (необходимо указать для целей программы) и, наконец, добавляет отфильтрованный $list
в $longlist
. Это делается для каждого файла, и, таким образом, каждый отфильтрованный файл добавляется в $longlist
.
Write-Host "Removing all duplicates..."
$longlist = $longlist | Get-Unique
Write-Host "Success!" -foregroundcolor "green"
Это удалит все дубликаты из $longlist
.
Write-host "Calculating total number of lines..."
$longlist | % { $totallines += $_.count }
Write-host "There are a total of " $totallines " unique and valid lines." -
foregroundcolor "green"
Это вычисляет общее количество уникальных допустимых строк. Это для информации пользователя и используется для расчета прогресса в индикаторе выполнения.
Write-host "Creating parts..."
$longlist | ForEach {
Add-Content $partdirectory/$partname.$endfilenumber.txt "$_"
$linecount++
$i++
If ($linecount -eq $maxsize) {
Write-host "Success! " $partname$endfilenumber " created" -foregroundcolor "green"
$endfilenumber++
$linecount = 0
}
If ($i % $interval -eq 0) {
$percent = ($i / $totallines) * 100
$percent = [math]::Round($percent,2)
Write-Progress -Activity "Creating parts" -Status $percent -PercentComplete $percent
}
}
Это самая важная часть. Создает файл с указанным именем файла в указанном каталоге. Он добавляет 1 строку $ longlist к этому файлу. Тогда это увеличивает $linecount
и $i
с 1. Если $linecount
равен указанному максимальному размеру файла, он увеличивает $endfilecount
на 1. Если нет, следующая строка будет добавлена в существующий файл.
Например, указанный размер файла - 10.000 строк, а имя детали - Part$endfilenumber
. Первая строка $longlist
добавляется в файл Part1.txt ($endfilenumber = 1
, как указано в первых строках кода). При добавлении 10.00-й строки используется оператор If
. Это означает, что $endfilenumber
увеличивается на 1. Таким образом, следующая строка из $longlist
будет добавлена в новый файл с именем Part2.txt (потому что $endfilenumber = 2
).
Второй оператор if используется для расчета прогресса. Это не очень важно, поэтому, чтобы сэкономить время, я не буду это объяснять.
$end = Get-Date
$time = ($end-$start).TotalMinutes
$time = [math]::Round($time,2)
Write-host "A total of " $endfilenumber " parts have been created" -
foregroundcolor "green"
Write-host "Total processing time: " $time " minutes" -foregroundcolor "green"
Write-Host "Press any key to exit..." -foregroundcolor "green"
$HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL
$HOST.UI.RawUI.Flushinputbuffer()
Это последняя часть кода. Это берет метку времени и вычитает ее из метки времени в начале. таким образом, время обработки рассчитывается в минутах и округляется до 2 десятичных знаков. Самый последний бит просто ожидает подтверждения пользователя, чтобы завершить и закрыть программу.
Я надеялся, что это немного поможет.
ПРИМЕЧАНИЕ: эта программа не влияет на оригинальные файлы! Так что это хорошо, я думаю ...