Jak posortować linie w pliku tekstowym według długości każdej linii w Notepad ++?

13

Jak mogę posortować plik tekstowy według długości linii w notatniku ++? Czy jest dostępna wtyczka do wspomnianego zadania?
W przypadku, gdy nie ma wtyczki, jaki jest pierwszy i może drugi samouczek do przeczytania, aby samemu napisać wtyczkę?

hpaknia
źródło
1
Wiesz, czasami najlepiej po prostu napisać kod i sobie z tym poradzić.
Daniel R Hicks,
Czy masz do czynienia z małymi czy dużymi plikami?
ComFreek,
Plik 50 MB z długimi liniami, około 250 KB długości.
hpaknia
Czy dane są wrażliwe? Czy możesz udostępnić go na Dropbox / Google-Drive / itp.? Jeśli Notepad ++ może otwierać i obsługiwać ten plik, wyobrażam sobie, że moje rozwiązanie zadziałałoby, ale chciałbym sam go wypróbować.
Dane
Hej @HPM, czy jest jakaś szansa na pracę nad danymi?
Dane

Odpowiedzi:

6

Ta odpowiedź jest inspirowana filmem na YouTube . Zaktualizowano, aby zachować oryginalny porządek sortowania, jeśli jest to ważne.

Notepad ++ ma wbudowane narzędzie TextFX, które sortuje wybrane linie alfabetycznie. To narzędzie można przejąć, aby posortować według długości linii, umieszczając spacje po lewej stronie każdej linii i upewniając się, że wszystkie linie są tej samej długości.

„Zoo” pojawia się alfabetycznie przed „Ich domem”, ponieważ przestrzeń jest traktowana jako znak i występuje przed „i”. __X(udawanie, że podkreślenia są naprawdę spacjami), podobnie jak wcześniej _XX. Ideą tej odpowiedzi jest dodanie spacji i numerów wierszy, __________092dogaby zostały posortowane powyżej _003alligator.

Użyję następujących danych przykładowych:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

Krok 1. Dodaj numery linii.

(Uwaga dodana przez barlop - uwaga dla czytelnika dotycząca tego kroku, nie będziemy sortować według tych numerów linii, sortujemy według długości linii. Ale powodem dodania numerów linii jest to, że znamy porządek naturalny, aby np. gdy dwie + linie mają równą długość, możemy sortować te linie zgodnie z tym porządkiem naturalnym)

Zakładając, że plik tekstowy zawiera tylko dane, umieść kursor tekstowy (linia pionowa) w pierwszej pozycji pliku. Następnie w Editmenu wybierz Column Editor...( Alt+ C). Wybierz „Liczba do wstawienia” i zacznij od 1, zwiększ o 1 i dołącz początkowe zera. Pamiętaj, że zachowa to oryginalne uporządkowanie podczas sortowania od najkrótszego ciągu do najdłuższego ciągu. Najpierw odwróć wszystkie linie, jeśli chcesz posortować od najdłuższego do najkrótszego.

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

Krok 2. Wypełnij wszystkie linie wiodącymi spacjami.

Umieść kursor tekstowy (linia pionowa) w pierwszej pozycji pliku. Następnie w Editmenu wybierz Column Editor...( Alt+ C). Wstaw wystarczająco dużo spacji, aby najkrótsza linia danych została uzupełniona do długości najdłuższej linii danych. Jeśli twoja najkrótsza linia ma 4 znaki, a najdłuższa 44, upewnij się, że wstawiłeś co najmniej 40 spacji.

__________1Lorem
__________2ipsum
__________3dolor
__________4sit
__________5amet
__________6consectetur
__________7adipisicing

Krok 3. Przytnij linie do jednakowej długości.

Użyj następującego wyrażenia regularnego Znajdź / Zamień ( Ctrl+ H), aby dopasować prawe znaki równe lub przekraczające długość najdłuższej linii danych.

^.*(.{50})$

Zamień wszystko na $1. Spowoduje to przycięcie wszystkiego oprócz 50 najbardziej odpowiednich znaków w każdej linii. Jeśli twoje dane są dłuższe (lub krótkie) niż 50, dostosuj {50}w Wyrażeniu regularnym.

(Uwaga dodana przez barlop - chodzi tutaj o to, że najkrótsze linie mają najwięcej spacji na początku )

_______1Lorem
_______2ipsum
_______3dolor
_________4sit
________5amet
_6consectetur
_7adipisicing

Krok 4. Sortuj linie.

Zaznacz cały tekst ( Ctrl+ A). W menu TextFX przejdź do Text FX > TextFX Tools > Sort lines case sensitive (at column). Twoje dane powinny być teraz uporządkowane według długości, od najkrótszej do najdłuższej. Jeśli chcesz je uporządkować od najdłuższego do najkrótszego, usuń zaznaczenie Text FX > TextFX Tools > + Sort ascendingopcji przed sortowaniem. Zwróć też uwagę na odwrócenie numerów linii.

_________4sit
________5amet
_______1Lorem
_______2ipsum
_______3dolor
_6consectetur
_7adipisicing

Krok 5. Usuń spacje wiodące.

Użyj innego wyrażenia regularnego Znajdź / Zamień ( Ctrl+ H), aby dopasować wiodące spacje.

^ *\d{4}

To przestrzeń między karetką a gwiazdką. Zastąp wszystko niczym. Spowoduje to usunięcie wszystkich początkowych spacji i wstawionych numerów linii, jeśli masz 4-cyfrowe numery linii. Zamień na {4}prawidłową liczbę cyfr w numerach linii.

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

MAKRO

Powyższe kroki nagrałem za pomocą funkcji makra Notepad ++ i to nie działa. Nie jestem pewien, który krok się nie powiedzie, ale nie zdiagnozowałem, dlaczego. Prawdopodobnie możesz użyć AutoHotKey do zautomatyzowania tego, jeśli robisz to wielokrotnie.

Duńczyk
źródło
2
Ostrzeżenie: nie jest to stabilny rodzaj. Innymi słowy, linie o tej samej długości niekoniecznie pojawią się w tej samej kolejności po sortowaniu - zamiast tego zostaną posortowane leksykograficznie.
Bob
@ Bob jest poprawny, jeśli masz wiersze o danej długości, takie jak 33 znaki, które mają określoną kolejność, która nie zostanie odzwierciedlona w wynikach. Możemy dodać numery linii za pomocą Alt + C przed krokiem 1 (w tym zera na początku, aby upewnić się, że długości pozostaną równe). Następnie, podczas czyszczenia w kroku 4, użyj ^ *\d{5}lub jakiejkolwiek liczby cyfr użyto dla numerów linii.
Dane
2
Odpowiedź została zaktualizowana w celu zachowania istniejącego porządku sortowania, przy założeniu, że jest to ważne.
Dane
niezły dane za śledzenie tego, co robił ten facet w filmie na youtube, gdzie również wyłączał komentarze. Czy na pastebin pastebin.com możesz podać link do tekstu, który Twoim zdaniem się nie powiedzie ? i czy zawiodło to tylko w makrze, czy też ręcznie?
barlop
1
Muszę powiedzieć, czytając twoją odpowiedź, zrozumiałem ją tylko wtedy, gdy jej spróbowałem. Myślę, że powodem, dla którego nie masz więcej głosów, może być to, że ludzie nie zrozumieli logiki. Czy pozwoliłbyś mi na początku wyjaśnić logikę swojej odpowiedzi?
barlop,
3

Nie, nie sądzę, żeby tak było. Najbliższa jest wtyczka TextFx, ale to sortowanie oparte na znakach, a nie oparte na długości linii. Najlepszym rozwiązaniem jest wrzucenie tekstu do arkusza kalkulacyjnego i posortowanie go (za pomocą oddzielnej kolumny obliczeniowej za pomocą LEN()funkcji).

snowdude
źródło
Dzięki, plik tekstowy ma długie linie i ogromny całkowity rozmiar, więc odłożyłem edytory arkuszy kalkulacyjnych. Pozwól mi zaktualizować pytanie.
hpaknia
@ HP dobrze, jeśli chcesz spojrzeć poza notatnik ++, to zrobi to wiersz polecenia. na przykład użyj niektórych poleceń, aby uzyskać długość linii na końcu każdej linii. wtedy byłbyś przynajmniej bliżej tego.
barlop
dzięki, to dobra rada. To, co mnie ciekawi, to wiele wtyczek NP ++, dlaczego ta nie istnieje?
hpaknia 17.09.13
1

Możesz używać SQL w N ++ w plikach CSV! Na przykład, jeśli masz:

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

, możesz wykonać polecenie select * from data order by length(col1) desc sortowania malejącego. „dane” oznaczają bieżący plik. „col1” - nazwa pierwszej (i ostatniej) kolumny.

Niestety prawdopodobnie istnieje błąd, który nie pozwala porzucić separatora po wierszach w tekście jednokolumnowym.

Greck
źródło
To jest naprawdę świetne rozwiązanie, jeśli tylko SQL w N ++ nie zmienił danych wyjściowych. Właśnie przetestowałem twoje rozwiązanie i dodałem ograniczniki na końcu wszystkich wierszy z szybką zamianą wyrażeń regularnych, ale dane wyjściowe konwertują wszystko na małe litery, a moje myślniki zastąpiłem znakami zapytania.
Dane
@Dane (obecnie nie mam dostępu do Notepad ++.) Być może spróbuj dodać pojedynczy cytat na początku i na końcu każdej linii (a następnie średnika)? Może podwójne cytaty?
Bob
@ Bob: nie dobrze. Małe litery są nawet wspomniane w uwagach do wydania dla SQL we wtyczce N ++.
Dane
0

Lub jeśli zdarzy ci się mieć Linuksa i Nedita:

ctrl-a
alt-r
perl -e 'print sort { length($a) <=> length($b) } <>'
użytkownik254657
źródło
Pytanie to nie tylko nie jest zadawane, ale nie dotyczy nawet tej samej platformy systemu operacyjnego.
Caleb
to wciąż pomocna odpowiedź. to był jedyny, który działał dobrze dla mnie. określił, że potrzebujesz linux i nedit, więc nie ma problemu.
Anthony