Як можна сортувати рядки в текстовому файлі за довжиною кожного рядка в Блокноті ++?


13

Як можна сортувати текстовий файл за довжиною рядка в блокноті ++? Чи є якийсь плагін для згаданого завдання?
У випадку, якщо плагіна немає, який перший та, можливо, другий підручник для читання, для того, щоб написати плагін Я сам?


1
Знаєте, іноді найкраще просто написати якийсь код і перейняти його.
Даніель Р Хікс

Чи маєте ви справу з малими чи великими файлами?
ComFreek

Файл 50 Мб з довгими рядками довжиною близько 250 КБ.
hpaknia

Чи чутливі дані? Чи можете ви поділитися цим вмістом на Dropbox / Google-Drive / тощо? Якщо Notepad ++ може відкрити цей файл і обробляти його, я б уявив, що моє рішення спрацює, але я хотів би спробувати його сам.
Дейн

Привіт @HPM, будь-який шанс отримати роботу над вашими даними?
Дейн

Відповіді:


6

Ця відповідь натхненна відео YouTube . Оновлено для підтримки оригінального порядку сортування, якщо це важливо.

У блокноті ++ є вбудований інструмент TextFX, який сортує вибрані рядки за алфавітом. Цей інструмент може бути викрадений для сортування за довжиною рядків, розміщуючи пробіли зліва від кожного рядка та переконуючись, що всі лінії однакової довжини.

"Зоопарк" з'являється в алфавітному порядку перед "Їхнім будинком", оскільки простір трактується як персонаж і йде перед "я". __X(зробивши вигляд, що підкреслення - це справді пробіли), аналогічно буде й раніше за алфавітом _XX. Ідея у цій відповіді - додати пробіли та номери рядків, які __________092dogбудуть відсортовані вище _003alligator.

Я буду використовувати наступні приклади:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

Крок 1. Додайте номери рядків.

(Примітка, додана барлопом - примітка для читача щодо цього кроку, ми не будемо сортувати за цими номерами рядків, ми сортуємо за довжиною рядків. Але причиною додавання номерів рядків є те, що ми знайте природний порядок, так що коли, наприклад, дві + лінії мають однакову довжину, ми можемо сортувати ці лінії відповідно до цього природного порядку)

Припускаючи, що у вашому текстовому файлі є лише дані, розмістіть текстовий курсор (вертикальну лінію) на перше місце у файлі. Потім у Editменю виберіть Column Editor...( Alt+ C). Виберіть "Число для вставки" і почніть з 1, збільшити на 1 і включити провідні нулі. Зауважте, що це збереже початкове впорядкування при сортуванні від найкоротшої до найдовшої. Спочатку переверніть всі рядки, якщо ви хочете сортувати найдовше до найкоротшого.

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

Крок 2. Прокладіть всі рядки з провідними пробілами.

Помістіть текстовий курсор (вертикальну лінію) в перше місце файлу. Потім у Editменю виберіть Column Editor...( Alt+ C). Вставте достатньо пробілів, щоб найкоротший рядок даних був викреслений до довжини найдовшої лінії даних. Якщо ваш найкоротший рядок має 4 символи, а найдовший 44, то обов’язково вставляйте принаймні 40 пробілів.

__________1Lorem
__________2ipsum
__________3dolor
__________4sit
__________5amet
__________6consectetur
__________7adipisicing

Крок 3. Обріжте лінії рівномірної довжини.

Використовуйте наступні функції пошуку / заміни регулярних виразів ( Ctrl+ H), щоб відповідати правим символам, що дорівнює або перевищує довжину найдовшої лінії даних.

^.*(.{50})$

Замініть все на $1. Це дозволить обрізати все, крім правильних 50 символів кожного рядка. Якщо ваші дані довші (або короткі), ніж 50, відрегулюйте параметр {50}у регулярному вираженні.

(Примітка додана барлопом. Ідея тут - найкоротші рядки мають найбільше пробілів на початку )

_______1Lorem
_______2ipsum
_______3dolor
_________4sit
________5amet
_6consectetur
_7adipisicing

Крок 4. Сортуйте лінії.

Виберіть увесь текст ( Ctrl+ A). Перейдіть до меню TextFX Text FX > TextFX Tools > Sort lines case sensitive (at column). Тепер ваші дані мають бути в порядку, від найкоротшого до найдовшого. Якщо ви хочете, щоб вони були від найдовшого до найкоротшого, зніміть прапорець Text FX > TextFX Tools > + Sort ascendingперед сортуванням. Зверніть увагу, як зворотні номери рядків також.

_________4sit
________5amet
_______1Lorem
_______2ipsum
_______3dolor
_6consectetur
_7adipisicing

Крок 5. Видаліть провідні пробіли.

Використовуйте інший пошук / заміна регулярних виразів ( Ctrl+ H), щоб відповідати провідним пробілам.

^ *\d{4}

Це простір між кареткою і зірочкою. Замініть все нічим. Це видалить усі провідні пробіли та вставлені номери рядків, якщо у вас були чотиризначні номери рядків. Замініть на {4}правильну кількість цифр у номерах рядків.

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

MACRO

Я записав вищезазначені дії за допомогою макро функції Notepad ++, і це не працює. Я не впевнений, який крок не вдається, але я не поставив діагноз, чому. Можливо, ви можете використовувати AutoHotKey для автоматизації цього, якщо ви робите це повторно.


2
Попередження: це не стійкий сорт. Іншими словами, рядки однакової довжини не обов'язково з’являться в одному порядку після сортування - натомість вони будуть сортуватися лексикографічно.
Боб

@Bob правильний, якщо у вас є рядки заданої довжини, наприклад 33 символи, які мають певний порядок на них, це не відображатиметься в результатах. Ми можемо додати номери рядків за допомогою Alt + C до кроку 1 (включаючи провідні 0, щоб забезпечити рівність довжин). Потім, прибираючи на етапі 4, використовуйте ^ *\d{5}або будь-яку кількість цифр, що використовуються для номерів рядків.
Дейн

2
Відповідь було оновлено, щоб зберегти існуючий порядок сортування, вважаючи, що це важливо.
Дейн

приємний один датчик для того, щоб слідкувати за тим, що робив той хлопець у відео YouTube, де він також відключив коментарі. Чи можете ви включити посилання на текст, де, на вашу думку, це не вдається, на pastebin.com pastebin.com ? і це не вдалося лише з макросом або також вручну?
барлоп

1
Треба сказати, читаючи вашу відповідь, я зрозумів це лише тоді, коли спробував. Я думаю, що причиною, чому ти не отримав більше голосів, може бути те, що люди не зрозуміли логіку. Чи дозволите ви мені на початку додати пояснення логіки до вашої відповіді?
барлоп

3

Ні, я не думаю, що існує. Найближчим є плагін TextFx, але це символьний сортування, а не довжина рядка. Ваша найкраща ставка - кинути текст у електронну таблицю і сортувати його там (використовуючи окремий обчислений стовпець за допомогою LEN()функції).


Дякую, текстовий файл має довгі рядки та величезний загальний розмір, тому я відклав редактори електронних таблиць. Дозвольте мені оновити питання.
hpaknia

@HPM добре, якщо ви готові шукати зовні блокнот ++, тоді командний рядок це зробить. наприклад, використовуйте деякі команди, щоб отримати довжину рядка кожного кінця кожного рядка. тоді ви хоч би були ближче до цього.
барлоп

дякую, це гарна порада. Мені цікаво, що NP ++ багато плагінів, чому цього не існує?
hpaknia

1

Ви можете використовувати SQL в N ++ у файлах CSV! Наприклад, якщо у вас є:

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

, Ви можете виконати команду select * from data order by length(col1) descдля сортування за спаданням. "дані" означає поточний файл. "col1" - назва першого (і останнього) стовпця.

На жаль, напевно є помилка, яка не дозволяє відміняти роздільник після рядків у тексті однієї колонки.


Це насправді чудове рішення, якщо тільки SQL в N ++ не маніпулював вихідними даними. Я щойно перевірив ваше рішення, і я додав роздільники в кінці всіх рядків швидкою заміною зворотного звороту, але вихідні дані перетворюють все на малі регістри і замінюють мої тире запитаннями.
Дейн

@Dane (я зараз не маю доступу до Notepad ++.) Можливо, спробуйте додати одну цитату до початку та кінця кожного рядка (а потім крапки з комою після цього)? Може, подвійні цитати?
Боб

@Bob: нічого хорошого. Про малі регістри навіть згадується у примітках до випуску для SQL в плагіні N ++.
Дейн

0

Або якщо у вас є Linux та nedit:

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

Це не лише те, про що ставилося питання, це навіть не застосовується до тієї ж платформи ОС.
Калеб

це все ще корисна відповідь. це був єдиний, який добре працював для мене. він уточнив, що вам потрібні linux та nedit, тому проблем немає.
Ентоні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.