Erstellen Sie Listen bestimmter LĂ€nge mit mehreren anderen Listen - Notepad ++, Datenbank, Notepad, Duplikat, Liste

Ich habe viele relativ kleine Dateien mit ca. 350.000 Textzeilen. Beispielsweise:

Datei 1:

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

Datei 2:

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

Wie Sie sehen können, ist Zeile 3 von Datei 2 ein Duplikat von Zeile 1 in Datei 1. Ich möchte ein Programm / Notepad ++ Plugin, das diese Duplikate in mehreren Dateien ĂŒberprĂŒfen und entfernen kann.

Das nĂ€chste Problem, das ich habe, ist, dass alle Listen zu großen 1.000.000 Zeilendateien zusammengefasst werden sollen. So habe ich zum Beispiel diese Dateien:

  • 648563 Zeilen
  • 375924 Zeilen
  • 487036 Zeilen

Ich möchte, dass sie zu folgenden Dateien fĂŒhren:

  • 1.000.000 Zeilen
  • 511.523 Zeilen

Und die letzten 2 Dateien dĂŒrfen nur aus Unique bestehenLinien. Wie kann ich das evtl. machen? Kann ich dafĂŒr einige Programme verwenden? Oder eine Kombination mehrerer Notepad ++ Plugins? Ich weiß, dass GSplit Dateien von 1.536.243 in Dateien von 1.000.000 und 536.243 Zeilen aufteilen kann, aber das ist nicht genug, und es entfernt keine Duplikate.

Ich möchte bei Bedarf mein eigenes Notepad ++ - Plugin oder -Programm erstellen, habe aber keine Ahnung, wie und wo ich anfangen soll.

Danke im Voraus.

Antworten:

0 fĂŒr Antwort № 1

Ich habe ein Skript fĂŒr Windows PowerShell erstellt und es als .ps1-Datei gespeichert. Ich habe es wie folgt erstellt:

$linecount = 0
$editfilenumber = 1
$endfilenumber = 1
$totallines = 0
$i = 0
$interval = 100 / 1

Dieser Teil dient nur zum ZurĂŒcksetzen aller Basisvariablen. $linecount wird fĂŒr die Anzahl der Linien verwendet, die in den neuen Teilen erstellt wurden (dazu spĂ€ter mehr). $editfilenumber wird fĂŒr die Dateinummer verwendet, die bearbeitet wird (Duplikate entfernt, ungĂŒltige entfernt ...). $endfilenumber wird fĂŒr die erstellte Teilenummer verwendet. $totallines wird fĂŒr die Gesamtzahl der Zeilen verwendet. $i wird zur Berechnung der ProzentsĂ€tze verwendet. $interval wird fĂŒr das Aktualisierungsintervall des Fortschrittsbalkens verwendet (andernfalls ist der Vorgang sehr langsam)

$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?"

Dies fragt den Benutzer grundsÀtzlich nach den Daten und nach der Anzahl der Zeilen in den Teilen.

$files = Get-ChildItem $srcdirectory -filter *.txt
Write-Host "These files will be edited and combined: "
$files | format-table name

Dadurch werden alle TXT-Dateien im angegebenen Verzeichnis aufgelistet. Dies geschieht, um dem Benutzer mitzuteilen, welche Dateien verwendet werden.

Write-Host "Press any key to continue..." -foregroundcolor "green"
$HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL
$HOST.UI.RawUI.Flushinputbuffer()

Dies wartet auf die BestĂ€tigung des Benutzers, indem auf das DrĂŒcken einer Taste gewartet wird.

$start = Get-Date

Dies liefert den aktuellen Zeitstempel zur Berechnung der Bearbeitungszeit am Ende.

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"
}

Dieser Teil ist sehr wichtig. ZunĂ€chst wird angezeigt, welche Datei bearbeitet wird, und eine $list des Inhalts dieser Datei. Danach werden alle eindeutigen Zeilen abgerufen (und somit Duplikate entfernt), ungĂŒltige Zeilen entfernt (mĂŒssen fĂŒr den Zweck des Programms angegeben werden) und schließlich die gefilterten Zeilen hinzugefĂŒgt $list zu $longlist. Dies erfolgt fĂŒr jede Datei und somit wird jede gefilterte Datei hinzugefĂŒgt $longlist.

Write-Host "Removing all duplicates..."
$longlist = $longlist | Get-Unique
Write-Host "Success!" -foregroundcolor "green"

Dadurch werden alle Duplikate von entfernt $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"

Dies berechnet die Gesamtzahl der eindeutigen gĂŒltigen Zeilen. Dies dient zur Information des Benutzers und wird zur Berechnung des Fortschritts in der Fortschrittsleiste verwendet.

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
}
}

Dies ist der wichtigste Teil. Es wird eine Datei mit dem angegebenen Dateinamen im angegebenen Verzeichnis erstellt. Es fĂŒgt dieser Datei 1 Zeile $ longlist hinzu. Dann nimmt es zu $linecount und $i mit 1. Wenn $linecount dann entspricht die angegebene maximale DateigrĂ¶ĂŸe, sie erhöht sich $endfilecount von 1. Wenn nicht, wird die nĂ€chste Zeile zur vorhandenen Datei hinzugefĂŒgt.

Beispiel: Die angegebene DateigrĂ¶ĂŸe betrĂ€gt 10.000 Zeilen und der Teilename lautet Part$endfilenumber. Die erste Zeile von $longlist wird der Datei Part1.txt hinzugefĂŒgt ($endfilenumber = 1, wie in den ersten Codezeilen angegeben). Wenn die 10.00ste Zeile hinzugefĂŒgt wird, wird die If Anweisung wird verwendet. Das bedeutet, dass $endfilenumber wird um 1 erhöht. Auf diese Weise kommt die nĂ€chste Zeile aus $longlist wird zu einer neuen Datei mit dem Namen Part2.txt hinzugefĂŒgt (weil $endfilenumber = 2).

Die zweite if-Anweisung wird zur Berechnung des Fortschritts verwendet. Das ist nicht sehr wichtig, deshalb werde ich das nicht erklÀren, um Zeit zu sparen.

$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()

Dies ist der letzte Teil des Codes. Dies nimmt den Zeitstempel und subtrahiert ihn am Anfang vom Zeitstempel. Auf diese Weise wird die Verarbeitungszeit in Minuten berechnet und auf 2 Dezimalstellen gerundet. Das allerletzte Bit wartet nur auf die BestĂ€tigung des Benutzers, um das Programm zu beenden und zu schließen.

Ich habe gehofft, dass das ein bisschen hilft.

HINWEIS: Dieses Programm wirkt sich NICHT auf die Originaldateien aus! Also das ist schön, denke ich ...


Lies jetzt