У меня много сравнительно небольших файлов с около 350 000 строк текста. Например:

Файл 1:

 1. asdf
 2. wetwert
 3. ddghr
 4. vbnd
 ...
 264187. sdfre

Файл 2:

 1. erye
 2. yren
 3. asdf
 4. jkdt
 ...
 184168. uory

Как вы можете видеть, строка 3 файла 2 является дубликатом строки 1 в файле 1. Я хочу плагин программы / Notepad++, который может проверять и удалять эти дубликаты в нескольких файлах.

Следующая проблема, которую я имею, состоит в том, что я хочу, чтобы все списки были объединены в большие 1.000.000 строковых файлов. Так, например, у меня есть эти файлы:

  • 648563 строки
  • 375924 строки
  • 487036 строк

Я хочу, чтобы они привели в эти файлы:

  • 1.000.000 строк
  • 511,523 строки

И последние 2 файла должны состоять только из уникальных строк. Как я могу это сделать? Могу ли я использовать некоторые программы для этого? Или сочетание нескольких плагинов Notepad++? Я знаю, что GSplit может разбивать файлы 1.536.243 на файлы с 1.000.000 и 536.243 строками, но этого недостаточно, и он не удаляет дубликаты.

Я действительно хочу создать свой собственный плагин или программу Notepad++, если это необходимо, но я не знаю, как и с чего начать.

Заранее спасибо.

1 ответ1

0

Я сделал скрипт для 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 десятичных знаков. Самый последний бит просто ожидает подтверждения пользователя, чтобы завершить и закрыть программу.

Я надеялся, что это немного поможет.

ПРИМЕЧАНИЕ: эта программа не влияет на оригинальные файлы! Так что это хорошо, я думаю ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .