Ich habe eine große Textdatei mit über 20.000 Zeilen. Die Reihenfolge der Zeilen ist wichtig. Ich möchte alle doppelten nicht leeren Zeilen in der Datei entfernen, ohne die Reihenfolge zu stören. Welche Windows -Software kann diese Aufgabe erfüllen?
Wenn möglich, möchte ich das Löschen jeder doppelten Zeile manuell bestätigen/verweigern.
Für diese Aufgabe:
Sie können dies versuchen: Doppelte Zeilen entfernen . Es ist eine Online-App, die doppelte Textzeilen löscht.
Es erlaubt Ihnen jedoch nicht, das Löschen jeder doppelten Zeile manuell zu bestätigen/zu verweigern.
Ehrlich gesagt ist meine Neigung für diese Art der (relativ einfachen) Textverarbeitung, ein schnelles und schmutziges Skript zu schreiben. Hier ist also ein schnelles und schmutziges Powershell-Skript, das Sie an Ihre Bedürfnisse anpassen können. Für Dateien mit 20 000 Zeilen denke ich, dass der get-content
Befehl in Ordnung sein sollte, aber wenn Ihre Dateien zu groß sind, benötigen Sie möglicherweise andere Optimierungen (Hashing-Zeilen als Wörterbuchschlüssel, Verwendung der .NET System.IO.StreamReader
-Klasse ...). Es gibt auch andere Möglichkeiten, die Dinge zu verbessern.
# Create a file consisting of an original file with duplicate lines
# removed, preserving line order.
# Run this at your own risk!
# Paul "Worthless" Nijjar, 2016-03-29
param(
[parameter(Mandatory=$true)][string] $InFile,
[parameter(Mandatory=$true)][string] $OutFile,
[parameter()][switch] $ConfirmRemovals
)
if ($InFile -eq $OutFile) {
write-error("Input and Output files should be different: $OutFile")
}
# Store all unique lines in a dictionary!
$linemap = @{}
$lineNumber = 0
# I hope you didn't need OutFile!
echo $null > $OutFile
foreach ($currLine in (Get-Content $InFile)) {
$lineNumber++
$outline = "{0}:`"{1}`"" -f $lineNumber, $currLine
write-debug $outline
if ($currLine.trim() -eq "" ) {
# Line is blank. Preserve it.
$currLine >> $OutFile
} elseif (! $linemap.ContainsKey($currLine)) {
# Not a duplicate. Record in map and write to file.
$linemap.Set_Item($currLine, $lineNumber)
$currLine >> $OutFile
} else {
$outline = "Line {0} `"{1}`" is a duplicate of line {2}" -f $lineNumber, $currLine, $linemap.Get_Item($currLine)
write-host $outline
if ($ConfirmRemovals) {
$omitIt = read-host -prompt "Omit it? (y/n)"
if ($omitIt -ne "y") {
write-host "Not deleting."
$currLine >> $OutFile
} else {
write-host "Omitting by confirmation."
} # end if omitIt check
} else {
write-host "Omitting."
} # End if confirm removals
} # end if linemap contains key
} # end get-content
Ich habe die Datei als Select-NonDuplicates.ps1
.
Hier ist eine Beispiel-Eingabedatei ( in.txt
):
cat
bat
Cat
cat
The above two WILL be duplicates!
Powershell is case insensitive for dictionary strings.
frogg
frog
Rabbit
Rabbit
The above will not be a duplicate.
Be careful of leading spaces. trim() can help here.
Rabbit
Blank lines will be preserved.
Monkey
Monkey
The above will not be a duplicate.
Be careful of trailing spaces, too.
frog
frog
Rabbit
Cat
Mountain goat
und hier die entsprechende Ausgabedatei ( out.txt
):
cat
bat
The above two WILL be duplicates!
Powershell is case insensitive for dictionary strings.
frogg
frog
Rabbit
Rabbit
The above will not be a duplicate.
Be careful of leading spaces. trim() can help here.
Blank lines will be preserved.
Monkey
Monkey
Be careful of trailing spaces, too.
Mountain goat
Ich rufe dies auf, indem ich eine Eingabeaufforderung öffne und Powershell wie folgt starte:
powershell -executionpolicy remotesigned
und dann an der Eingabeaufforderung eingeben
& Select-NonDuplicates.ps1 -InFile in.txt -Outfile out.txt
Geben Sie Folgendes ein, um das Entfernen zu bestätigen:
& Select-NonDuplicates.ps1 -InFile in.txt -Outfile out.txt -ConfirmRemovals
(Es gelten die üblichen Haftungsausschlüsse: Ich bin ein mittelmäßiger Programmierer und es gibt wahrscheinlich Fehler, der Code ist nicht gut getestet und kann alles ruinieren. Ich entschuldige mich, wenn dieser Detailgrad herablassend rüberkommt, Windows kostet mehr als ein Milchshake.)
AkelPad und Geany können das. Beide bewältigen problemlos 20.000 Zeilen.
AkelPad: Optionen → Plugins... → Format::LineRemoveDuplicates → Aufruf
Es ist nicht interaktiv, aber Sie können die zu entfernenden Zeilen mit Format::LineGetDuplicates sehen
Das Installationsprogramm enthält Plug-Ins, aber wenn Sie die portable Version verwenden, stellen Sie sicher, dass Sie das Format -Plug-In installieren.
Geany: Extras
→ Plugin-Manager → Zeilenoperationen aktivieren →
Tools schließen → Zeilenoperationen → Doppelte Zeilen entfernen, geordnet
Huey
RockPaperLz- Maskiere es oder Casket