Составьте списки определенной длины, используя несколько других списков

376
Werner Schoemaker

У меня много сравнительно небольших файлов с около 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 ++, если это необходимо, но я не знаю, как и с чего начать.

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

0
Вы можете использовать Excel для этого, просто скопируйте текст всех ваших текстовых файлов в столбец Excel, а затем используйте команду «Удалить дубликаты» в Excel. Yacine 7 лет назад 0
@ Yacine Я думаю, что это практически невозможно, потому что со временем добавляется все больше и больше файлов, и в настоящее время у меня около 10 миллионов строк. И если бы я сделал это таким образом, как я могу экспортировать все в файлах по 1 миллиону строк? Werner Schoemaker 7 лет назад 0
Это кажется естественным для утилит командной строки. В Linux вы должны использовать: `cat" File "* | сортировать | uniq | split -d -l 1000000 - Комбинированный.; это сгенерирует `Combined.00`,` Combined.01`, ... Существуют версии всех этих утилит для Windows, хотя строки выполнения могут немного отличаться. AFH 7 лет назад 1
@AFH Ваше решение работает довольно хорошо, за исключением части 'split'. Я не могу найти эквивалент Windows для этого. У вас есть идея, как я могу решить это? Потому что объединение, сортировка, удаление дубликатов и сохранение в новый файл работает очень хорошо. Werner Schoemaker 7 лет назад 0
Среди прочего, он включен в утилиты в [win-bash] (https://sourceforge.net/projects/win-bash/). AFH 7 лет назад 0
nonono :) не win-bash. Это 2017 год. Используйте PowerShell. Wouter 7 лет назад 0

1 ответ на вопрос

0
Werner Schoemaker

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

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

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

На практике ваши ответы не просто для того, чтобы помочь вам - это следующий человек с такой же проблемой - поэтому публикация вашего скрипта powershell будет признательна, чтобы избежать эффекта [denvercoder / xkcd 979] (https://xkcd.com/979/ ) Journeyman Geek 7 лет назад 0

Похожие вопросы