Como posso classificar as linhas em um arquivo de texto, pelo comprimento de cada linha, no Notepad ++?

13

Como posso classificar um arquivo de texto pelo comprimento da linha no bloco de notas ++? Existe algum plugin disponível para a tarefa mencionada?
Caso não exista um plug-in, qual é o primeiro e talvez o segundo tutorial a serem lidos, Para escrever o próprio plugin?

hpaknia
fonte
1
Às vezes, é melhor escrever apenas um código e acabar logo com isso.
Daniel R Hicks
Você está lidando com arquivos pequenos ou grandes?
ComFreek
Arquivo de 50 MB com linhas longas, aproximadamente 250 KB de comprimento.
Hpaknia
Os dados são sensíveis? Ou você pode compartilhá-lo no Dropbox / Google-Drive / etc.? Se o Notepad ++ puder abrir e manipular esse arquivo, eu imaginaria que minha solução funcionaria, mas eu adoraria testá-la.
Dane
Hey @HPM, tem alguma chance de trabalhar com seus dados?
Dane

Respostas:

6

Esta resposta é inspirada em um vídeo do YouTube . Atualizado para manter a ordem de classificação original, se isso for importante.

O Notepad ++ possui uma ferramenta TextFX interna que classifica as linhas selecionadas em ordem alfabética. Essa ferramenta pode ser invadida para classificar pelo comprimento das linhas, colocando espaços à esquerda de cada linha e certificando-se de que todas as linhas tenham o mesmo comprimento.

"The Zoo" vem em ordem alfabética antes de "Their House" porque o espaço é tratado como um personagem e vem antes de "i". __X(fingir que os sublinhados são realmente espaços) também virá alfabeticamente antes _XX. A idéia nesta resposta é adicionar espaços e números de linha para que __________092dogsejam classificados acima _003alligator.

Usarei o seguinte como exemplo de dados:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

Etapa 1. Adicione números de linha.

(Observação adicionada por barlop - uma observação para o leitor sobre esta etapa, não classificaremos de acordo com esses números de linha, classificamos de acordo com o comprimento das linhas. Mas a razão para adicionar os números de linha é que conhecer a ordem natural, de modo que quando, por exemplo, duas + linhas tiverem o mesmo comprimento, poderemos classificá-las de acordo com essa ordem natural)

Supondo que seu arquivo de texto tenha apenas os dados, coloque o cursor de texto (a linha vertical) na primeira posição do arquivo. Em seguida, no Editmenu, selecione Column Editor...( Alt+ C). Escolha "Número a inserir" e comece com 1, aumente 1 e inclua zeros à esquerda. Observe que isso manterá a ordem original ao classificar da sequência mais curta para a mais longa. Inverta todas as linhas primeiro se desejar classificar do maior para o menor.

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

Etapa 2. Preencha todas as linhas com espaços à esquerda.

Coloque o cursor do texto (a linha vertical) na primeira posição do arquivo. Em seguida, no Editmenu, selecione Column Editor...( Alt+ C). Insira espaços suficientes para que a menor linha de dados seja preenchida com o comprimento da maior linha de dados. Se sua linha mais curta tiver 4 caracteres e a mais longa 44, insira pelo menos 40 espaços.

__________1Lorem
__________2ipsum
__________3dolor
__________4sit
__________5amet
__________6consectetur
__________7adipisicing

Etapa 3. Corte as linhas em um comprimento uniforme.

Use a seguinte Localização / Substituição de Expressão Regular ( Ctrl+ H) para corresponder aos caracteres do lado direito iguais ou superiores ao comprimento da sua linha de dados mais longa.

^.*(.{50})$

Substitua tudo por $1. Isso irá aparar tudo, exceto os 50 caracteres mais à direita de cada linha. Se seus dados forem maiores (ou curtos) que 50, ajuste-os {50}na Expressão regular.

(Nota adicionada por barlop - a ideia aqui é que as linhas mais curtas tenham mais espaços no início )

_______1Lorem
_______2ipsum
_______3dolor
_________4sit
________5amet
_6consectetur
_7adipisicing

Etapa 4. Classifique as linhas.

Selecione todo o texto ( Ctrl+ A). Através do menu TextFX, vá para Text FX > TextFX Tools > Sort lines case sensitive (at column). Seus dados agora devem estar em ordem de comprimento, do menor para o maior. Se você deseja que eles sejam ordenados do maior para o menor, desmarque a Text FX > TextFX Tools > + Sort ascendingopção antes de classificar. Observe como os números das linhas também são revertidos.

_________4sit
________5amet
_______1Lorem
_______2ipsum
_______3dolor
_6consectetur
_7adipisicing

Etapa 5. Remova os espaços à esquerda.

Use outra Localização / Substituição de Expressão Regular ( Ctrl+ H) para corresponder aos espaços à esquerda.

^ *\d{4}

Esse é um espaço entre o sinal de intercalação e o asterisco. Substitua tudo por nada. Isso removerá todos os espaços à esquerda e os números de linha inseridos, se você tiver números de linha de 4 dígitos. Substitua {4}por o número correto de dígitos nos números de linha.

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

MACRO

Gravei as etapas acima usando o recurso de macro do Notepad ++ e ele não funciona. Não tenho certeza de qual etapa falhará, mas ainda não diagnosticei o porquê. Você provavelmente poderia usar o AutoHotKey para automatizar isso se fizer isso repetidamente.

dinamarquês
fonte
2
Aviso: este não é um tipo estável. Em outras palavras, linhas do mesmo comprimento não aparecerão necessariamente na mesma ordem após a classificação - em vez disso, serão classificadas lexicograficamente.
Bob
@Bob está correto, se você tiver linhas de um determinado comprimento, como 33 caracteres, que tenham uma ordem específica para elas, que não serão refletidas nos resultados. Podemos adicionar os números de linha com Alt + C antes da etapa 1 (incluindo 0s iniciais para garantir que os comprimentos permaneçam iguais). Em seguida, ao limpar na etapa 4, use ^ *\d{5}ou o número de dígitos usado para os números de linha.
Dane
2
A resposta foi atualizada para manter a ordem de classificação existente, assumindo que isso é importante.
Dane
bom dinamarquês por seguir o que aquele cara no vídeo do youtube estava fazendo, onde ele também desativou os comentários. Você pode incluir um link para o texto em que você acha que falha, em pastebin pastebin.com ? e falhou apenas com a macro ou manualmente também?
barlop
1
Devo dizer que, lendo sua resposta, só a compreendi quando tentei. Eu acho que uma razão pela qual você não tem mais votos pode ser que as pessoas não tenham entendido a lógica. Você me permitiria adicionar uma explicação da lógica, à sua resposta, no início?
barlop
3

Não, acho que não existe. O mais próximo é o plugin TextFx, mas é uma classificação baseada em caracteres e não no comprimento da linha. Sua melhor aposta é lançar o texto em uma planilha e classificá-lo lá (usando uma coluna computada separada usando oLEN() função).

snowdude
fonte
Obrigado, o arquivo de texto tem linhas longas e tamanho total enorme, então guardei os editores de planilhas. Deixe-me atualizar a pergunta.
hpaknia
@ HPM bem, se você estiver disposto a procurar fora do bloco de notas ++, a linha de comando o faria. como usar alguns comandos para obter o comprimento da linha no final de cada linha. pelo menos você estaria mais perto de fazê-lo.
barlop
obrigado, é um bom conselho. O que me interessa é o NP ++, muitos plugins, por que esse não existe?
Hpaknia
1

Você pode usar SQL em N ++ em arquivos CSV! Por exemplo, se você tiver:

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

, você pode executar o comando select * from data order by length(col1) desc para classificar decrescente. "dados" significa arquivo atual. "col1" - nome da primeira (e última) coluna.

Infelizmente, provavelmente existe um erro que não permite o delimitador de abandono após as linhas no texto de uma coluna.

Greck
fonte
Essa é realmente uma ótima solução, se apenas o SQL no N ++ não alterasse a saída de dados. Acabei de testar sua solução e adicionei delimitadores ao final de todas as linhas com uma rápida substituição de regex, mas a saída de dados converte tudo em minúsculas e substitui meus traços por pontos de interrogação.
Dane
@Dane (atualmente não tenho acesso ao Notepad ++.) Talvez tente adicionar uma única citação ao início e ao final de cada linha (e depois o ponto e vírgula depois disso)? Talvez aspas duplas?
22413 Bob
@ Bob: não é bom. A coisa em minúsculas é mencionada nas notas de versão do plug-in SQL no N ++.
Dane
0

Ou se você tiver linux e nedit:

ctrl-a
alt-r
perl -e 'print sort { length($a) <=> length($b) } <>'
user254657
fonte
Não é só isso que a pergunta foi feita, nem é aplicável à mesma plataforma do sistema operacional.
Caleb #
ainda é uma resposta útil. foi o único que funcionou bem para mim. ele especificou que você precisa de linux e nedit, então não há problema.
Anthony