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


Como posso classificar um arquivo de texto por comprimento de linha no notepad ++? Existe algum plugin disponível para a tarefa mencionada?
No caso em que não há plugin, Qual é o primeiro e talvez segundo tutorial para ler, Para escrever o plugin Eu mesmo?


13


origem


Você sabe, às vezes é melhor escrever 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, com cerca de 250 KB. - HPM
Os dados são sensíveis? Ou você poderia compartilhá-lo no Dropbox / Google-Drive / etc? Se o Notepad ++ puder abrir e manipular esse arquivo, imagino que minha solução funcionaria, mas adoraria testá-lo eu mesmo. - Dane
Hey @HPM, alguma chance de trabalhar em seus dados? - Dane


Respostas:


Esta resposta é inspirada por 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 sequestrada para classificar pelo comprimento das linhas, colocando espaços à esquerda de cada linha e certificando-se de que todas as linhas tenham o mesmo tamanho.

"O Zoo" vem em ordem alfabética antes de "Sua Casa" porque o espaço é tratado como um personagem e vem antes de "i". __X (fingindo que os sublinhados são realmente espaços) também virão alfabeticamente antes _XX. A ideia nesta resposta é adicionar espaços e números de linha para que __________092dog será classificado acima _003alligator.

Vou usar o seguinte como dados de exemplo:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

Etapa 1. Adicione números de linha.

(Nota adicionada por barlop - uma nota para o leitor sobre esta etapa, não estaremos classificando de acordo com esses números de linha, estamos classificando de acordo com o comprimento das linhas. Mas a razão para adicionar os números de linha, é por isso Conhecer a ordem natural, de modo que, quando, por exemplo, duas linhas são de igual comprimento, podemos classificar essas linhas 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. Então no Edit seleção de menu Column Editor... (Alt+C). Escolha "Número para inserir", comece com 1, aumente em 1 e inclua zeros à esquerda. Observe que isso manterá a ordem original ao classificar da cadeia mais curta para a mais longa. Inverta todas as linhas primeiro se você quiser classificar mais longo para o mais curto.

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

Etapa 2. Almofada de todas as linhas com espaços iniciais.

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

__________1Lorem
__________2ipsum
__________3dolor
__________4sit
__________5amet
__________6consectetur
__________7adipisicing

Etapa 3. Apare as linhas para um comprimento uniforme.

Use o seguinte Localizar / Substituir Expressão Regular (Ctrl+H) para coincidir com os caracteres à direita, igualando ou excedendo o comprimento de sua linha de dados mais longa.

^.*(.{50})$

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

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

_______1Lorem
_______2ipsum
_______3dolor
_________4sit
________5amet
_6consectetur
_7adipisicing

Etapa 4. Classifique as linhas.

Selecione todo o texto (Ctrl+UMA). Através do menu TextFX, vá para Text FX > TextFX Tools > Sort lines case sensitive (at column). Seus dados devem estar em ordem de duração, do menor para o maior. Se você quiser na ordem de mais longa para a mais curta, desmarque a opção Text FX > TextFX Tools > + Sort ascending opção antes de ordenar. Observe como os números de linha também são invertidos.

_________4sit
________5amet
_______1Lorem
_______2ipsum
_______3dolor
_6consectetur
_7adipisicing

Etapa 5. Remova os espaços iniciais.

Use outra expressão regular Localizar / Substituir (Ctrl+H) para coincidir com os espaços principais.

^ *\d{4}

Esse é um espaço entre o acento circunflexo e o asterisco. Substitua tudo por nada. Isso removerá todos os espaços iniciais e os números de linha inseridos, se você tivesse números de linha de 4 dígitos. Substitua o {4} com o número correto de dígitos em seus números de linha.

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

MACRO

Eu gravei os passos acima usando o recurso macro do Notepad ++, e ele não funciona. Não tenho certeza qual etapa falha, mas não diagnostiquei o motivo. Você provavelmente poderia usar AutoHotKey para automatizar isso se você fizer isso repetidamente.


6



Aviso: este não é um tipo estável. Em outras palavras, as linhas do mesmo comprimento não aparecerão necessariamente na mesma ordem após a classificação - em vez disso, elas serão classificadas lexicograficamente. - Bob
@Bob está correto, se você tiver linhas de um determinado tamanho, como 33 caracteres, que tenham uma ordem específica para elas, isso não será refletido nos resultados. Podemos adicionar os números de linha com Alt + C antes da etapa 1 (incluindo os 0s iniciais para garantir que os comprimentos permaneçam iguais). Então, ao limpar na etapa 4, use ^ *\d{5} ou qualquer número de dígitos foram usados ​​para os números de linha. - Dane
A resposta foi atualizada para manter a ordem de classificação existente, supondo que isso seja importante. - Dane
Um bom dinamarquês por seguir o que aquele cara no vídeo do youtube estava fazendo, onde ele também desativava os comentários. Você pode incluir um link para o texto onde você acha que ele falha? pastebin.com ? e falhou apenas com a macro ou manualmente também? - barlop
Devo dizer, lendo sua resposta, eu só entendi 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 começo? - barlop


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


3



Obrigado, o arquivo de texto tem linhas longas e tamanho total enorme, então eu coloquei os editores de planilhas de lado. Deixe-me atualizar a questão. - HPM
@HPM bem, se você estiver disposto a olhar para fora do notepad ++, a linha de comando fará isso. Por exemplo, use alguns comandos para obter o comprimento da linha no final de cada linha. então você pelo menos estaria mais perto de fazer isso. - barlop
obrigado, é um bom conselho. O que eu estou curioso sobre é NP ++ muitos plugins, porque este não existe? - HPM


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 classificar em ordem decrescente. "dados" significa arquivo atual. "col1" - nome da primeira (e última) coluna.

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


1



Esta é realmente uma ótima solução, se apenas SQL em N ++ não mangle 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 para minúsculas e substituí meus traços por pontos de interrogação. - Dane
@Dane (atualmente não tenho acesso ao Notepad ++.) Talvez tente adicionar uma aspa simples ao início e ao final de cada linha (e depois o ponto-e-vírgula depois disso)? Talvez aspas duplas? - Bob
@Bob: não é bom. A coisa minúscula é mencionada nas notas de lançamento do plug-in SQL in N ++. - Dane


Ou se você tiver linux e nedit:

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

0



Não só isso não é o que a pergunta perguntou, nem sequer é aplicável à mesma plataforma de 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