Wie kann ich die Zeilen in einer Textdatei nach der Länge jeder Zeile in Notepad ++ sortieren?


13

Wie kann ich eine Textdatei in Notepad ++ nach Zeilenlänge sortieren? Gibt es ein Plugin für die genannte Aufgabe?
Falls es kein Plugin gibt, Was ist das erste und vielleicht das zweite Tutorial, das gelesen werden muss, um das Plugin selbst zu schreiben?


1
Wissen Sie, manchmal ist es am besten, einfach Code zu schreiben und es hinter sich zu bringen.
Daniel R Hicks

Haben Sie es mit kleinen oder großen Dateien zu tun?
ComFreek

50 MB Datei mit langen Zeilen, ca. 250 KB Länge.
hpaknia

Sind die Daten sensibel? Oder könnten Sie es auf Dropbox / Google-Drive / etc. Teilen? Wenn Notepad ++ diese Datei öffnen und verarbeiten kann, würde ich mir vorstellen, dass meine Lösung funktionieren würde, aber ich würde sie gerne selbst ausprobieren.
Däne

Hey @HPM, haben Sie eine Chance, Ihre Daten zu bearbeiten?
Däne

Antworten:


6

Diese Antwort wurde von einem YouTube-Video inspiriert . Aktualisiert, um die ursprüngliche Sortierreihenfolge beizubehalten, falls dies wichtig ist.

Notepad ++ verfügt über ein integriertes TextFX-Tool, mit dem ausgewählte Zeilen alphabetisch sortiert werden. Mit diesem Werkzeug können Sie nach der Länge der Zeilen sortieren, indem Sie links von jeder Zeile Leerzeichen einfügen und sicherstellen, dass alle Zeilen gleich lang sind.

"The Zoo" steht alphabetisch vor "Their House", da der Raum als Zeichen behandelt wird und vor "i" steht. __X(so zu tun, als wären die Unterstriche wirklich Leerzeichen) wird in ähnlicher Weise alphabetisch vor kommen _XX. Die Idee in dieser Antwort ist, Leerzeichen und Zeilennummern hinzuzufügen, __________092dogdamit sie oben sortiert werden _003alligator.

Als Beispieldaten verwende ich:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

Schritt 1. Fügen Sie Zeilennummern hinzu.

(Anmerkung hinzugefügt von barlop - eine Anmerkung für den Leser zu diesem Schritt, wir werden nicht nach diesen Zeilennummern sortieren, wir sortieren nach der Länge der Zeilen. Aber der Grund für das Hinzufügen der Zeilennummern ist der gleiche wie wir.) kennen die natürliche Reihenfolge, so dass, wenn zum Beispiel zwei + Zeilen gleich lang sind, wir diese Zeilen nach dieser natürlichen Reihenfolge sortieren können)

Angenommen, Ihre Textdatei enthält nur die Daten, platzieren Sie den Textcursor (die vertikale Linie) an der allerersten Position der Datei. Wählen Sie dann im EditMenü Column Editor...( Alt+ C). Wählen Sie "Number to Insert" und beginnen Sie mit 1, erhöhen Sie um 1 und geben Sie führende Nullen ein. Beachten Sie, dass die ursprüngliche Reihenfolge beim Sortieren von der kürzesten zur längsten Zeichenfolge beibehalten wird. Kehren Sie zuerst alle Zeilen um, wenn Sie am längsten bis zum kürzesten sortieren möchten.

1Lorem
2ipsum
3dolor
4sit
5amet
6consectetur
7adipisicing

Schritt 2. Füllen Sie alle Zeilen mit führenden Leerzeichen auf.

Setzen Sie den Textcursor (die vertikale Linie) an die allererste Position der Datei. Wählen Sie dann im EditMenü Column Editor...( Alt+ C). Fügen Sie genügend Leerzeichen ein, damit die kürzeste Datenzeile auf die Länge der längsten Datenzeile aufgefüllt wird. Wenn Ihre kürzeste Zeile 4 Zeichen und Ihre längste 44 Zeichen hat, stellen Sie sicher, dass Sie mindestens 40 Leerzeichen einfügen.

__________1Lorem
__________2ipsum
__________3dolor
__________4sit
__________5amet
__________6consectetur
__________7adipisicing

Schritt 3. Schneiden Sie die Linien auf eine einheitliche Länge.

Verwenden Sie das folgende Suchen / Ersetzen ( Ctrl+ H) für reguläre Ausdrücke , um die Zeichen der rechten Hand abzugleichen, die der Länge Ihrer längsten Datenzeile entsprechen oder diese überschreiten.

^.*(.{50})$

Ersetzen Sie alle durch $1. Dadurch wird alles außer den 50 am weitesten rechts stehenden Zeichen jeder Zeile abgeschnitten. Wenn Ihre Daten länger (oder kürzer) als 50 sind, passen Sie das {50}im regulären Ausdruck an.

(Anmerkung von Barlop hinzugefügt - die Idee hier ist, dass die kürzesten Linien am Anfang die meisten Leerzeichen haben. )

_______1Lorem
_______2ipsum
_______3dolor
_________4sit
________5amet
_6consectetur
_7adipisicing

Schritt 4. Sortieren Sie die Zeilen.

Markieren Sie den gesamten Text ( Ctrl+ A). Gehen Sie über das TextFX-Menü zu Text FX > TextFX Tools > Sort lines case sensitive (at column). Ihre Daten sollten nun in der Reihenfolge ihrer Länge vorliegen, von der kürzesten bis zur längsten. Wenn Sie möchten, dass sie in der Reihenfolge vom längsten zum kürzesten sind, deaktivieren Sie die Text FX > TextFX Tools > + Sort ascendingOption vor dem Sortieren. Beachten Sie, wie die Zeilennummern ebenfalls vertauscht werden.

_________4sit
________5amet
_______1Lorem
_______2ipsum
_______3dolor
_6consectetur
_7adipisicing

Schritt 5. Entfernen Sie führende Leerzeichen.

Verwenden Sie ein anderes Suchen / Ersetzen ( Ctrl+ H) für reguläre Ausdrücke , um die führenden Leerzeichen abzugleichen.

^ *\d{4}

Das ist ein Leerzeichen zwischen dem Caret und dem Sternchen. Ersetze alles durch nichts. Das wird alle führenden Leerzeichen und die eingefügten Zeilennummern entfernen, wenn Sie 4-stellige Zeilennummern hatten. Ersetzen Sie die {4}durch die richtige Anzahl von Ziffern in Ihren Zeilennummern.

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

MAKRO

Ich habe die obigen Schritte mit der Makrofunktion von Notepad ++ aufgezeichnet und sie funktioniert nicht. Ich bin nicht sicher, welcher Schritt fehlschlägt, aber ich habe nicht diagnostiziert, warum. Sie könnten wahrscheinlich AutoHotKey verwenden, um dies zu automatisieren, wenn Sie es wiederholt tun.


2
Achtung: Dies ist keine stabile Sorte. Mit anderen Worten, Zeilen gleicher Länge erscheinen nach dem Sortieren nicht unbedingt in der gleichen Reihenfolge, sondern werden lexikografisch sortiert.
Bob

@Bob ist korrekt, wenn Sie Zeilen einer bestimmten Länge haben, z. B. 33 Zeichen, die eine bestimmte Reihenfolge haben, die in den Ergebnissen nicht berücksichtigt wird. Wir können die Zeilennummern mit Alt + C vor Schritt 1 hinzufügen (einschließlich führender Nullen, um sicherzustellen, dass die Längen gleich bleiben). Verwenden Sie dann beim Bereinigen in Schritt 4 ^ *\d{5}oder eine beliebige Anzahl von Ziffern für die Zeilennummern.
Däne

2
Die Antwort wurde aktualisiert, um die vorhandene Sortierreihenfolge beizubehalten, sofern dies wichtig ist.
Däne

nice one dane für das Verfolgen, was der Typ im Youtube-Video gemacht hat, wo er auch Kommentare deaktiviert hat. Können Sie auf pastebin pastebin.com einen Link zu Text einfügen, von dem Sie glauben, dass er fehlschlägt ? und ist es nur mit dem makro oder auch manuell fehlgeschlagen?
Barlop

1
Ich muss sagen, als ich Ihre Antwort las, habe ich sie erst verstanden, als ich sie ausprobiert habe. Ich denke, ein Grund, warum Sie nicht mehr Stimmen haben, könnte sein, dass die Leute die Logik nicht verstanden haben. Würden Sie mir erlauben, Ihrer Antwort zu Beginn eine Erklärung der Logik hinzuzufügen?
Barlop

3

Nein, ich glaube nicht. Das nächste ist das TextFx-Plugin, aber das ist eine zeichenbasierte Sortierung, nicht zeilenlängenbasiert. Am besten werfen Sie den Text in eine Tabelle und sortieren ihn dort (mithilfe der LEN()Funktion in einer separaten berechneten Spalte ).


Danke, die Textdatei hat lange Zeilen und eine riesige Gesamtgröße, also habe ich die Tabellenkalkulations-Editoren weggelegt. Lassen Sie mich die Frage aktualisieren.
hpaknia

@HPM Nun, wenn Sie bereit sind, außerhalb von Notepad ++ zu suchen, würde dies die Befehlszeile tun. Verwenden Sie zum Beispiel einige Befehle, um die Länge der Zeilen und das Ende jeder Zeile zu ermitteln. dann wärst du wenigstens näher dran.
Barlop

Danke, es ist ein guter Rat. Was mich neugierig macht sind NP ++ und viele Plugins, warum gibt es diese nicht?
hpaknia

1

Sie können SQL in N ++ in CSV-Dateien verwenden! Zum Beispiel, wenn Sie:

col1;
hgfhfghfhg;
khjfhgfhfghfgh;
kjhfhgfhfhgfghfhf;
lkjgjghjhg;
lkjgjg;

können Sie den Befehl ausführen select * from data order by length(col1) desc, um absteigend zu sortieren. "Daten" bedeutet aktuelle Datei. "col1" - Name der ersten (und letzten) Spalte.

Leider gibt es wahrscheinlich einen Fehler, der es nicht erlaubt, Trennzeichen nach Zeilen in einspaltigem Text zu setzen.


Dies ist eine großartige Lösung, wenn nur SQL in N ++ die Datenausgabe nicht beeinträchtigt. Ich habe gerade Ihre Lösung ausprobiert und am Ende aller Zeilen Begrenzungszeichen mit einem schnellen Regex-Ersetzen hinzugefügt, aber die Datenausgabe konvertiert alles in Kleinbuchstaben und ersetzt meine Gedankenstriche durch Fragezeichen.
Däne

@Dane (Ich habe derzeit keinen Zugriff auf Notepad ++.) Fügen Sie am Anfang und am Ende jeder Zeile (und danach am Semikolon) möglicherweise ein einzelnes Anführungszeichen hinzu. Vielleicht doppelte Anführungszeichen?
Bob

@ Bob: nicht gut. Die Kleinschreibung wird sogar in den Versionshinweisen für das SQL in N ++ Plug-In erwähnt.
Däne

0

Oder wenn Sie zufällig Linux und nedit haben:

ctrl-a
alt-r
perl -e 'print sort { length($a) <=> length($b) } <>'

Dies ist nicht nur nicht das, was die Frage gestellt hat, es ist auch nicht auf dieselbe Betriebssystemplattform anwendbar.
Caleb

Es ist immer noch eine hilfreiche Antwort. Es war das einzige, das für mich gut funktionierte. Er hat angegeben, dass Sie Linux und nedit benötigen, damit es kein Problem gibt.
Anthony
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.