Comment puis-je trier les lignes dans un fichier texte, par la longueur de chaque ligne, dans Notepad ++?

13

Comment puis-je trier un fichier texte par longueur de ligne dans notepad ++? Existe-t-il un plugin disponible pour la tâche mentionnée?
Dans le cas où il n'y a pas de plugin, quel est le premier et peut-être le deuxième tutoriel à lire, afin d'écrire le plugin moi-même?

hpaknia
la source
1
Vous savez, il est parfois préférable d'écrire du code et d'en finir.
Daniel R Hicks
Avez-vous affaire à des fichiers petits ou gros?
ComFreek
Fichier de 50 Mo avec de longues lignes, environ 250 Ko de longueur.
hpaknia
Les données sont-elles sensibles? Ou pourriez-vous le partager sur Dropbox / Google-Drive / etc.? Si Notepad ++ peut ouvrir et gérer ce fichier, j'imagine que ma solution fonctionnerait, mais j'adorerais l'essayer moi-même.
Dane
Hé @HPM, avez-vous une chance de travailler sur vos données?
Dane

Réponses:

6

Cette réponse est inspirée d'une vidéo YouTube . Mis à jour pour conserver l'ordre de tri d'origine, si cela est important.

Notepad ++ possède un outil TextFX intégré qui trie les lignes sélectionnées par ordre alphabétique. Cet outil peut être détourné pour trier selon la longueur des lignes en plaçant des espaces à gauche de chaque ligne et en s'assurant que toutes les lignes sont de la même longueur.

"Le zoo" vient alphabétiquement avant "leur maison" car l'espace est traité comme un personnage et précède "i". __X(prétendre que les traits de soulignement sont vraiment des espaces) viendra de même par ordre alphabétique auparavant _XX. L'idée dans cette réponse est d'ajouter des espaces et des numéros de ligne afin qu'ils __________092dogsoient triés ci-dessus _003alligator.

Je vais utiliser les données suivantes comme exemple:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

Étape 1. Ajoutez des numéros de ligne.

(Note ajoutée par barlop - une note pour le lecteur concernant cette étape, nous ne trierons pas en fonction de ces numéros de ligne, nous trierons en fonction de la longueur des lignes. Mais la raison de l'ajout des numéros de ligne est que nous connaître l'ordre naturel, de sorte que lorsque, par exemple, deux lignes + sont de longueur égale, nous pouvons trier ces lignes selon cet ordre naturel)

En supposant que votre fichier texte ne contient que des données, placez le curseur de texte (la ligne verticale) à la toute première position du fichier. Ensuite, dans le Editmenu, sélectionnez Column Editor...( Alt+ C). Choisissez "Nombre à insérer" et commencez par 1, augmentez de 1 et incluez des zéros non significatifs. Notez que cela conservera l'ordre d'origine lors du tri de la chaîne la plus courte à la chaîne la plus longue. Inversez d'abord toutes les lignes si vous souhaitez trier du plus long au plus court.

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

Étape 2. Remplissez toutes les lignes avec des espaces de début.

Placez le curseur de texte (la ligne verticale) à la toute première position du fichier. Puis dans le Editmenu sélectionnezColumn Editor... ( Alt+ C). Insérez suffisamment d'espaces pour que la ligne de données la plus courte soit complétée jusqu'à la longueur de la ligne de données la plus longue. Si votre ligne la plus courte comporte 4 caractères et votre plus longue 44, assurez-vous d'insérer au moins 40 espaces.

__________1Lorem
__________2ipsum
__________3dolor
__________4sit
__________5amet
__________6consectetur
__________7adipisicing

Étape 3. Coupez les lignes à une longueur uniforme.

Utilisez la recherche / remplacement d'expressions régulières suivante (Ctrl + H) suivante pour faire correspondre les caractères de droite égalant ou dépassant la longueur de votre ligne de données la plus longue.

^.*(.{50})$

Remplacer tout par $1 . Cela supprimera tout sauf les 50 caractères les plus à droite de chaque ligne. Si vos données sont plus longues (ou courtes) que 50, ajustez le {50}dans l'expression régulière.

(Note ajoutée par barlop - l'idée ici est que les lignes les plus courtes ont le plus d'espaces au début )

_______1Lorem
_______2ipsum
_______3dolor
_________4sit
________5amet
_6consectetur
_7adipisicing

Étape 4. Triez les lignes.

Sélectionnez tout le texte ( Ctrl+ A). Via le menu TextFX, allez à Text FX > TextFX Tools > Sort lines case sensitive (at column). Vos données doivent maintenant être classées par ordre de longueur, du plus court au plus long. Si vous souhaitez les Text FX > TextFX Tools > + Sort ascendingclasser du plus long au plus court, décochez l' option avant de trier. Notez également comment les numéros de ligne sont inversés.

_________4sit
________5amet
_______1Lorem
_______2ipsum
_______3dolor
_6consectetur
_7adipisicing

Étape 5. Supprimez les espaces de tête.

Utilisez une autre recherche / remplacement d'expression régulière ( Ctrl+ H) pour faire correspondre les espaces de tête.

^ *\d{4}

C'est un espace entre le curseur et l'astérisque. Remplacez tout par rien. Cela supprimera tous les espaces de tête et les numéros de ligne insérés, si vous aviez des numéros de ligne à 4 chiffres. Remplacez le {4}par le nombre correct de chiffres dans vos numéros de ligne.

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

MACRO

J'ai enregistré les étapes ci-dessus en utilisant la fonction macro de Notepad ++, et cela ne fonctionne pas. Je ne sais pas quelle étape échoue, mais je n'ai pas diagnostiqué pourquoi. Vous pourriez probablement utiliser AutoHotKey pour automatiser cela si vous le faites à plusieurs reprises.

Danois
la source
2
Attention: ce n'est pas un tri stable. En d'autres termes, les lignes de même longueur n'apparaîtront pas nécessairement dans le même ordre après le tri - elles seront plutôt triées lexicographiquement.
Bob
@Bob est correct, si vous avez des lignes d'une longueur donnée, comme 33 caractères, qui ont un ordre particulier, qui ne seront pas reflétées dans les résultats. Nous pouvons ajouter les numéros de ligne avec Alt + C avant l'étape 1 (y compris les 0 en tête pour garantir que les longueurs restent égales). Ensuite, lors du nettoyage à l'étape 4, utilisez ^ *\d{5}ou n'importe quel nombre de chiffres ont été utilisés pour les numéros de ligne.
Dane
2
La réponse a été mise à jour pour conserver l'ordre de tri existant, en supposant que cela est important.
Dane
gentil Danois pour avoir suivi ce que faisait ce gars dans la vidéo youtube, où il a également désactivé les commentaires. Pouvez-vous inclure un lien vers du texte là où vous pensez qu'il échoue, sur pastebin pastebin.com ? et a-t-il échoué uniquement avec la macro, ou manuellement également?
barlop
1
Je dois dire qu'en lisant votre réponse, je ne l'ai compris que lorsque je l'ai essayé. Je pense qu'une des raisons pour lesquelles vous n'avez pas obtenu plus de votes pourrait être que les gens n'ont pas compris la logique. Pourriez-vous me permettre d'ajouter une explication de la logique, à votre réponse, au début?
barlop
3

Non, je ne pense pas. Le plus proche est le plugin TextFx mais c'est un tri basé sur les caractères et non sur la longueur des lignes. Votre meilleur pari est de jeter le texte dans une feuille de calcul et de le trier là-bas (en utilisant une colonne calculée distincte en utilisant la LEN()fonction).

snowdude
la source
Merci, le fichier texte a de longues lignes et une taille totale énorme, alors j'ai mis de côté les éditeurs de feuilles de calcul. Permettez-moi de mettre à jour la question.
hpaknia
@HPM bien si vous êtes prêt à regarder en dehors du bloc-notes ++, la ligne de commande le fera. comme utiliser certaines commandes pour obtenir la longueur de la ligne à la fin de chaque ligne. alors vous seriez au moins plus près de le faire.
barlop
merci, c'est un bon conseil. Ce qui m'intéresse, c'est de nombreux plugins NP ++, pourquoi celui-ci n'existe pas?
hpaknia
1

Vous pouvez utiliser SQL en N ++ dans des fichiers CSV! Par exemple si vous avez:

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

, vous pouvez exécuter la commande select * from data order by length(col1) desc pour trier par ordre décroissant. "données" signifie le fichier actuel. "col1" - nom de la première (et dernière) colonne.

Malheureusement, il y a probablement un bogue qui ne permet pas d'abandonner le délimiteur après les lignes dans le texte à une colonne.

Greck
la source
C'est en fait une excellente solution, si seulement SQL en N ++ ne modifiait pas la sortie des données. Je viens de tester votre solution et j'ai ajouté des délimiteurs à la fin de toutes les lignes avec un remplacement regex rapide, mais la sortie de données convertit tout en minuscules et a remplacé mes tirets par des points d'interrogation.
Dane
@Dane (je n'ai actuellement pas accès à Notepad ++.) Essayez peut-être d'ajouter un guillemet simple au début et à la fin de chaque ligne (puis le point-virgule après cela)? Peut-être des guillemets doubles?
Bob
@Bob: pas bon. La chose en minuscules est même mentionnée dans les notes de publication du plug-in SQL in N ++.
Dane
0

Ou si vous avez Linux et Nedit:

ctrl-a
alt-r
perl -e 'print sort { length($a) <=> length($b) } <>'
user254657
la source
Non seulement ce n'est pas ce que la question a posé, mais ce n'est même pas applicable à la même plate-forme de système d'exploitation.
Caleb
c'est toujours une réponse utile. c'était le seul qui fonctionnait bien pour moi. il a précisé que vous avez besoin de linux et de nedit, donc il n'y a pas de problème.
Anthony