Я сделал скрипт для 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 десятичных знаков. Самый последний бит просто ожидает подтверждения пользователя, чтобы завершить и закрыть программу.
Я надеялся, что это немного поможет.
ПРИМЕЧАНИЕ: эта программа не влияет на оригинальные файлы! Так что это хорошо, я думаю ...