Textverarbeitungs-App zum Löschen doppelter Zeilen in Textdateien

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

  • Ich bevorzuge Software. Dies ist keine Voraussetzung, aber die Software darf nicht mehr als ein Milchshake kosten.
  • Ich bevorzuge Software (kein Installer), aber das ist keine Voraussetzung.
Könnte einen Blick wert sein Entfernen doppelter Zeilen in Notepad ++
@Huey Danke Huey. Bei den meisten Antworten musste die Reihenfolge der Zeilen geändert werden. Die Antworten, die diese Anforderung nicht spezifizierten, funktionierten leider nicht.

Antworten (3)

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-contentBefehl 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.)

Danke Paul! Gar nichts Bevormundendes! Da Powershell mit Windows kostenlos ist und ich bereits dafür bezahlt habe, sind die finanziellen Gesamtkosten null. Ich werde mir so schnell wie möglich ansehen, was du erstellt hast. Es könnte perfekt sein! :-)

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

Vielen Dank! Ich habe AkelPad ausprobiert und es war sehr schnell. Leider will es auch etwa 500 Leerzeilen entfernen, die in der Datei verteilt sind. Ist es möglich, die Leerzeilen in AkelPad zu ignorieren?
@RockPaperLizard, nicht dass ich wüsste. Ich habe diese Anforderung völlig übersehen, sorry. Es sollte über das Skript-Plug-in machbar sein, fragen Sie vielleicht im Forum nach .
Überhaupt kein Problem. Vielen Dank für die Empfehlungen!