Как отсортировать строки в текстовом файле по длине каждой строки в Notepad ++?

13

Как я могу отсортировать текстовый файл по длине строки в блокноте ++? Есть ли плагин для указанной задачи?
Если плагин отсутствует, какой первый и, возможно, второй учебник прочитать, чтобы написать плагин сам?

hpaknia
источник
1
Знаете, иногда лучше просто написать код и покончить с этим.
Даниэль Р Хикс
Вы имеете дело с маленькими или большими файлами?
ComFreek,
Файл 50 МБ с длинными строками, длиной около 250 КБ.
13
Являются ли данные чувствительными? Или вы могли бы поделиться им на Dropbox / Google-Drive / и т.д.? Если Notepad ++ сможет открывать и обрабатывать этот файл, я представляю, что мое решение будет работать, но я бы с удовольствием попробовал его сам.
датчанин
Эй @HPM, есть ли шанс получить работу с вашими данными?
датчанин

Ответы:

6

Этот ответ вдохновлен видео на YouTube . Обновлен, чтобы поддерживать оригинальный порядок сортировки, если это важно.

Notepad ++ имеет встроенный инструмент TextFX, который сортирует выделенные строки по алфавиту. Этот инструмент можно перехватить для сортировки по длине линий, поместив пробелы слева от каждой строки и убедившись, что все строки имеют одинаковую длину.

«Зоопарк» идет в алфавитном порядке перед «Их домом», потому что пространство рассматривается как символ и идет перед «я». __X(притворяясь, что подчеркивания на самом деле пробелы), аналогично, придет в алфавитном порядке раньше _XX. Идея в этом ответе заключается в добавлении пробелов и номеров строк, которые __________092dogбудут отсортированы выше _003alligator.

Я буду использовать следующие данные в качестве примера:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

Шаг 1. Добавьте номера строк.

(Примечание, добавленное barlop - примечание для читателя об этом шаге, мы не будем сортировать по этим номерам строк, мы сортируем по длине строк. Но причина добавления номеров строк заключается в том, что мы знать естественный порядок, так что, когда, например, две + строки имеют одинаковую длину, мы можем отсортировать эти строки в соответствии с этим естественным порядком)

Предполагая, что ваш текстовый файл содержит только данные, поместите текстовый курсор (вертикальная линия) в самую первую позицию файла. Затем в 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}в регулярном выражении.

(Примечание добавлено barlop - идея здесь в том, что самые короткие строки имеют наибольшее количество пробелов в начале )

_______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-значные номера строк. Замените на {4}правильное количество цифр в номерах строк.

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

MACRO

Я записал вышеупомянутые шаги, используя функцию макроса Notepad ++, и она не работает. Я не уверен, какой шаг терпит неудачу, но я не диагностировал почему. Возможно, вы могли бы использовать AutoHotKey для автоматизации этого, если вы делаете это неоднократно.

датчанин
источник
2
Предупреждение: это не стабильный вид. Другими словами, строки одинаковой длины не обязательно будут появляться в том же порядке после сортировки - вместо этого они будут отсортированы лексикографически.
Боб
@Bob является правильным, если у вас есть строки заданной длины, например, 33 символа, которые имеют определенный порядок, которые не будут отражены в результатах. Мы можем добавить номера строк с помощью Alt + C до шага 1 (включая начальные 0, чтобы обеспечить одинаковую длину). Затем при очистке на шаге 4 используйте ^ *\d{5}или любое другое количество цифр для номеров строк.
датчанин
2
Ответ был обновлен, чтобы сохранить существующий порядок сортировки, предполагая, что это важно.
датчанин
хороший датчанин за то, что следил за тем, что делал тот парень в видео на YouTube, где он также отключил комментарии. Можете ли вы добавить ссылку на текст там, где вы думаете, что это не сработало, на pastebin pastebin.com ? и не получилось ли это только с макросом или вручную?
Barlop
1
Надо сказать, прочитав твой ответ, я понял это только когда попробовал. Я думаю, что причина, почему у вас нет больше голосов, может быть в том, что люди не поняли логику. Вы позволите мне добавить объяснение логики к вашему ответу в начале?
Barlop
3

Нет, я не думаю, что есть. Самый близкий плагин TextFx, но это сортировка на основе символов, а не на основе длины строки. Лучше всего поместить текст в электронную таблицу и отсортировать его там (используя отдельный вычисляемый столбец с использованием LEN()функции).

snowdude
источник
Спасибо, текстовый файл имеет длинные строки и огромный общий размер, поэтому я убрал редакторы электронных таблиц. Позвольте мне обновить вопрос.
hpaknia
@HPM хорошо, если вы хотите посмотреть за пределы блокнота ++, тогда командная строка сделает это. Например, используйте некоторые команды, чтобы получить длину строки в конце каждой строки. тогда ты, по крайней мере, был бы ближе к этому.
Бароп
спасибо, это хороший совет Что меня интересует, так это множество плагинов NP ++, почему этого не существует?
hpaknia
1

Вы можете использовать SQL в N ++ в файлах CSV! Например, если у вас есть:

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

Вы можете выполнить команду select * from data order by length(col1) descсортировки по убыванию. «данные» означает текущий файл. «col1» - имя первого (и последнего) столбца.

К сожалению, возможно, есть ошибка, которая не позволяет отказаться от разделителя после строк в тексте из одного столбца.

Greck
источник
Это действительно отличное решение, если бы только SQL в N ++ не искажал вывод данных. Я только что проверил ваше решение и добавил в конце всех строк разделители с быстрой заменой регулярных выражений, но вывод данных преобразует все в строчные буквы и заменил мои черточки на вопросительные знаки.
датчанин
@Dane (в настоящее время у меня нет доступа к Notepad ++.) Возможно, попробуйте добавить одну кавычку в начало и конец каждой строки (а затем точку с запятой после этого)? Может быть, двойные кавычки?
Боб
@ Боб: ничего хорошего. Строчные буквы упоминаются даже в примечаниях к выпуску плагина SQL в N ++.
датчанин
0

Или если у вас есть Linux и Nedit:

ctrl-a
alt-r
perl -e 'print sort { length($a) <=> length($b) } <>'
user254657
источник
Мало того, что это не то, что задан вопрос, это даже не относится к той же платформе ОС.
Калеб
это все еще полезный ответ. это был единственный, который работал хорошо для меня. он указал, что вам нужны linux и nedit, так что проблем нет.
Энтони