¿Cómo puedo ordenar las líneas en un archivo de texto, por la longitud de cada línea, en Notepad ++?

13

¿Cómo puedo ordenar un archivo de texto por longitud de línea en notepad ++? ¿Hay algún complemento disponible para la tarea mencionada?
En caso de que no haya un complemento, ¿Cuál es el primer y quizás el segundo tutorial para leer? ¿Para escribir el complemento Yo mismo?

hpaknia
fuente
1
Ya sabes, a veces es mejor escribir un código y terminar de una vez.
Daniel R Hicks
¿Estás tratando con archivos pequeños o grandes?
ComFreek
Archivo de 50 MB con líneas largas, aproximadamente 250 KB de longitud.
hpaknia
¿Son sensibles los datos? ¿O podría compartirlo en Dropbox / Google-Drive / etc.? Si Notepad ++ puede abrir y manejar ese archivo, imagino que mi solución funcionaría, pero me encantaría probarlo yo mismo.
Dane
Hola @HPM, ¿alguna posibilidad de trabajar con tus datos?
Dane

Respuestas:

6

Esta respuesta está inspirada en un video de YouTube . Actualizado para mantener el orden de clasificación original, si eso es importante.

Notepad ++ tiene una herramienta incorporada de TextFX que ordena las líneas seleccionadas alfabéticamente. Esta herramienta se puede secuestrar para ordenar por la longitud de las líneas colocando espacios a la izquierda de cada línea y asegurándose de que todas las líneas tengan la misma longitud.

"El zoológico" aparece alfabéticamente antes de "Su casa" porque el espacio se trata como un personaje y aparece antes de "i". __X(simulando que los guiones bajos son realmente espacios) también aparecerán alfabéticamente antes _XX. La idea en esta respuesta es agregar espacios y números de línea para que __________092dogse ordenen arriba_003alligator .

Usaré lo siguiente como datos de ejemplo:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

Paso 1. Agregar números de línea.

(Nota agregada por barlop: una nota para el lector con respecto a este paso, no estaremos ordenando de acuerdo con estos números de línea, estamos ordenando de acuerdo con la longitud de las líneas. Pero la razón para agregar los números de línea es que conocer el orden natural, de modo que cuando, por ejemplo, dos líneas + tienen la misma longitud, podemos clasificar esas líneas de acuerdo con ese orden natural)

Suponiendo que su archivo de texto solo contenga los datos, coloque el cursor de texto (la línea vertical) en la primera posición del archivo. Luego, en el Editmenú, seleccione Column Editor...( Alt+ C). Elija "Número para insertar" y comience con 1, aumente en 1 e incluya ceros a la izquierda. Tenga en cuenta que esto retendrá el orden original al ordenar de la cadena más corta a la más larga. Invierta todas las líneas primero si desea ordenar de mayor a menor.

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

Paso 2. Rellene todas las líneas con espacios iniciales.

Coloque el cursor de texto (la línea vertical) en la primera posición del archivo. Luego, en el Editmenú, seleccione Column Editor...( Alt+ C). Inserte suficientes espacios para que la línea de datos más corta se rellene hasta la longitud de la línea de datos más larga. Si su línea más corta tiene 4 caracteres y la más larga tiene 44, asegúrese de insertar al menos 40 espacios.

__________1Lorem
__________2ipsum
__________3dolor
__________4sit
__________5amet
__________6consectetur
__________7adipisicing

Paso 3. Recorte las líneas a una longitud uniforme.

Use el siguiente Buscar / Reemplazar expresión regular ( Ctrl+ H) para hacer coincidir los caracteres de la derecha que igualen o excedan la longitud de su línea de datos más larga.

^.*(.{50})$

Reemplace todo con $1. Eso recortará todo excepto los 50 caracteres más a la derecha de cada línea. Si sus datos son más largos (o cortos) que 50, ajuste la {50}expresión regular.

(Nota agregada por barlop: la idea aquí es que las líneas más cortas tienen más espacios al principio )

_______1Lorem
_______2ipsum
_______3dolor
_________4sit
________5amet
_6consectetur
_7adipisicing

Paso 4. Ordena las líneas.

Seleccione todo el texto ( Ctrl+ A). A través del menú TextFX, vaya a Text FX > TextFX Tools > Sort lines case sensitive (at column). Sus datos ahora deben estar en orden de longitud, de menor a mayor. Si los quiere en orden del más largo al más corto, desmarque la Text FX > TextFX Tools > + Sort ascendingopción antes de ordenar. Observe cómo también se invierten los números de línea.

_________4sit
________5amet
_______1Lorem
_______2ipsum
_______3dolor
_6consectetur
_7adipisicing

Paso 5. Eliminar los espacios iniciales.

Use otra expresión regular Buscar / reemplazar ( Ctrl+ H) para hacer coincidir los espacios iniciales.

^ *\d{4}

Ese es un espacio entre el cursor y el asterisco. Reemplace todo con nada. Eso eliminará todos los espacios iniciales y los números de línea insertados, si tenía números de línea de 4 dígitos. Reemplace el {4}con el número correcto de dígitos en sus números de línea.

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

MACRO

Grabé los pasos anteriores con la función macro de Notepad ++, y no funciona. No estoy seguro de qué paso falla, pero no he diagnosticado por qué. Probablemente podría usar AutoHotKey para automatizar esto si lo hace repetidamente.

danés
fuente
2
Advertencia: este no es un tipo estable. En otras palabras, las líneas de la misma longitud no aparecerán necesariamente en el mismo orden después de la clasificación, sino que se ordenarán lexicográficamente.
Bob
@Bob es correcto, si tiene líneas de una longitud determinada, como 33 caracteres, que tienen un orden particular, que no se reflejarán en los resultados. Podemos agregar los números de línea con Alt + C antes del paso 1 (incluidos los ceros a la izquierda para garantizar que las longitudes permanezcan iguales). Luego, cuando limpie en el paso 4, use ^ *\d{5}o la cantidad de dígitos que se usó para los números de línea.
Dane
2
La respuesta se ha actualizado para mantener el orden de clasificación existente, suponiendo que sea importante.
Dane
un buen día por seguir lo que estaba haciendo ese tipo en el video de YouTube, donde también deshabilitó los comentarios. ¿Puede incluir un enlace al texto donde cree que falla, en pastebin pastebin.com ? ¿Y falló solo con la macro, o también manualmente?
barlop
1
Debo decir, leyendo tu respuesta, solo lo entendí cuando lo intenté. Creo que una razón por la que no tienes más votos podría ser que la gente no ha entendido la lógica. ¿Me permitiría agregar una explicación de la lógica, a su respuesta, al principio?
barlop
3

No, no creo que haya. El más cercano es el complemento TextFx, pero es una clasificación basada en caracteres, no basada en la longitud de la línea. Su mejor opción es tirar el texto en una hoja de cálculo y ordenarlo allí (usando una columna computada separada usando la LEN()función).

Snowdude
fuente
Gracias, el archivo de texto tiene líneas largas y un tamaño total enorme, así que guardé los editores de hojas de cálculo. Déjame actualizar la pregunta.
hpaknia
@HPM bien, si estás dispuesto a mirar fuera de Notepad ++, entonces la línea de comando lo haría. como usar algunos comandos para obtener la longitud de la línea al final de cada línea. entonces al menos estarías más cerca de hacerlo.
barlop
Gracias, es un buen consejo. Lo que me interesa es NP ++, muchos complementos, ¿por qué este no existe?
hpaknia
1

¡Puedes usar SQL en N ++ en archivos CSV! Por ejemplo si tienes:

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

, puede ejecutar el comando select * from data order by length(col1) descpara ordenar descendente. "datos" significa el archivo actual. "col1": nombre de la primera (y última) columna.

Desafortunadamente, es probable que haya un error que no permita el delimitador de abandono después de las líneas en el texto de una columna.

Greck
fuente
Esta es realmente una gran solución, si solo SQL en N ++ no destruyera la salida de datos. Acabo de probar su solución y agregué delimitadores al final de todas las líneas con un reemplazo rápido de expresiones regulares, pero la salida de datos convierte todo a minúsculas y reemplazó mis guiones con signos de interrogación.
Dane
@Dane (actualmente no tengo acceso a Notepad ++.) ¿Quizás intente agregar una comilla simple al principio y al final de cada línea (y luego el punto y coma después de eso)? Tal vez comillas dobles?
Bob
@Bob: no está bien. Lo minúsculo incluso se menciona en las notas de la versión del complemento SQL en N ++.
Dane
0

O si tienes linux y nedit:

ctrl-a
alt-r
perl -e 'print sort { length($a) <=> length($b) } <>'
usuario254657
fuente
No solo no es esto lo que se hizo la pregunta, ni siquiera es aplicable a la misma plataforma de sistema operativo.
Caleb
Sigue siendo una respuesta útil. fue el único que funcionó bien para mí. Él especificó que necesita Linux y Nedit, por lo que no hay problema.
Anthony