Come posso ordinare le righe in un file di testo, in base alla lunghezza di ciascuna riga, in Notepad ++?


13

Come posso ordinare un file di testo per lunghezza della linea in notepad ++? Sono disponibili plug-in per l'attività menzionata?
Nel caso in cui non sia presente alcun plug-in, qual è il primo e forse il secondo tutorial da leggere per poter scrivere il plug-in?


1
Sai, a volte è meglio semplicemente scrivere un po 'di codice e finirlo.
Daniel R Hicks,

Hai a che fare con file piccoli o grandi?
ComFreek,

File da 50 MB con linee lunghe, circa 250 KB di lunghezza.
hpaknia,

I dati sono sensibili? O potresti condividerlo su Dropbox / Google-Drive / ecc.? Se Notepad ++ è in grado di aprire e gestire quel file, immagino che la mia soluzione funzionerebbe, ma mi piacerebbe provarlo da solo.
Dane,

Ehi @HPM, hai qualche possibilità di lavorare sui tuoi dati?
Dane,

Risposte:


6

Questa risposta è ispirata a un video di YouTube . Aggiornato per mantenere l'ordinamento originale, se questo è importante.

Notepad ++ ha uno strumento TextFX incorporato che ordina le linee selezionate in ordine alfabetico. Questo strumento può essere dirottato per ordinare in base alla lunghezza delle linee posizionando gli spazi a sinistra di ogni linea e assicurandosi che tutte le linee abbiano la stessa lunghezza.

"Lo zoo" viene in ordine alfabetico prima di "La loro casa" perché lo spazio viene trattato come un personaggio e viene prima di "i". __X(fingendo che i caratteri di sottolineatura siano in realtà degli spazi) verrà similmente in ordine alfabetico prima _XX. L'idea in questa risposta è quella di aggiungere spazi e numeri di riga in modo che __________092dogvengano ordinati sopra _003alligator.

Userò i seguenti dati di esempio:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

Passaggio 1. Aggiungi numeri di riga.

(Nota aggiunta da barlop: una nota per il lettore relativa a questo passaggio, non ordineremo in base a questi numeri di riga, stiamo ordinando in base alla lunghezza delle righe. Ma la ragione per aggiungere i numeri di riga, è quindi conoscere l'ordine naturale, in modo che quando ad esempio due + linee abbiano la stessa lunghezza possiamo ordinare quelle linee in base a quell'ordine naturale)

Supponendo che il file di testo contenga solo i dati, posizionare il cursore di testo (la linea verticale) nella prima posizione del file. Quindi nel Editmenu selezionare Column Editor...( Alt+ C). Scegli "Numero da inserire" e inizia con 1, aumenta di 1 e includi gli zeri iniziali. Si noti che ciò manterrà l'ordinamento originale durante l'ordinamento dalla stringa più corta alla stringa più lunga. Invertire prima tutte le linee se si desidera ordinare dal più lungo al più corto.

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

Passaggio 2. Riempi tutte le linee con spazi iniziali.

Posiziona il cursore di testo (la linea verticale) nella prima posizione del file. Quindi nel Editmenu selezionare Column Editor...( Alt+ C). Inserire spazi sufficienti in modo che la linea di dati più corta venga riempita per la lunghezza della linea di dati più lunga. Se la tua linea più corta ha 4 caratteri e la più lunga 44, assicurati di inserire almeno 40 spazi.

__________1Lorem
__________2ipsum
__________3dolor
__________4sit
__________5amet
__________6consectetur
__________7adipisicing

Passaggio 3. Tagliare le linee a una lunghezza uniforme.

Utilizzare la seguente ricerca / sostituzione di espressioni regolari ( Ctrl+ H) per far corrispondere i caratteri della mano destra uguali o superiori alla lunghezza della linea di dati più lunga.

^.*(.{50})$

Sostituisci tutto con $1. Ciò eliminerà tutto tranne i 50 caratteri più a destra di ogni riga. Se i tuoi dati sono più lunghi (o brevi) di 50, modifica l' {50}espressione regolare.

(Nota aggiunta da barlop: l'idea qui è che le linee più brevi hanno più spazi all'inizio )

_______1Lorem
_______2ipsum
_______3dolor
_________4sit
________5amet
_6consectetur
_7adipisicing

Passaggio 4. Ordinare le linee.

Seleziona tutto il testo ( Ctrl+ A). Tramite il menu TextFX, vai a Text FX > TextFX Tools > Sort lines case sensitive (at column). I dati ora dovrebbero essere in ordine di lunghezza, dal più breve al più lungo. Se li desideri in ordine dal più lungo al più corto, deseleziona l' Text FX > TextFX Tools > + Sort ascendingopzione prima di ordinare. Nota come anche i numeri di riga vengono invertiti.

_________4sit
________5amet
_______1Lorem
_______2ipsum
_______3dolor
_6consectetur
_7adipisicing

Passaggio 5. Rimuovere gli spazi iniziali.

Usa un'altra espressione regolare Trova / Sostituisci ( Ctrl+ H) per abbinare gli spazi iniziali.

^ *\d{4}

Questo è uno spazio tra il cursore e l'asterisco. Sostituisci tutto con niente. Ciò rimuoverà tutti gli spazi iniziali e i numeri di riga inseriti, se avessi numeri di riga di 4 cifre. Sostituisci {4}con il numero corretto di cifre nei numeri di riga.

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

MACRO

Ho registrato i passaggi precedenti usando la funzione macro di Notepad ++ e non funziona. Non sono sicuro di quale passo fallisca, ma non ho diagnosticato il perché. Probabilmente potresti usare AutoHotKey per automatizzare questo se lo fai ripetutamente.


2
Attenzione: questo non è un ordinamento stabile. In altre parole, le linee della stessa lunghezza non appariranno necessariamente nello stesso ordine dopo l'ordinamento, ma verranno ordinate lessicograficamente.
Bob,

@Bob è corretto, se hai linee di una determinata lunghezza, come 33 caratteri, che hanno un ordine particolare per loro, che non si rifletteranno nei risultati. È possibile aggiungere i numeri di riga con Alt + C prima del passaggio 1 (compresi gli 0 iniziali per garantire che le lunghezze restino uguali). Quindi, durante la pulizia del passaggio 4, utilizzare ^ *\d{5}o il numero di cifre utilizzato per i numeri di riga.
Dane,

2
La risposta è stata aggiornata per conservare l'ordinamento esistente, supponendo che sia importante.
Dane,

bello uno per aver seguito quello che stava facendo quel ragazzo nel video di YouTube, dove disabilitava anche i commenti. Puoi includere un link al testo dove pensi che non funzioni, su pastebin pastebin.com ? e ha fallito solo con la macro, o anche manualmente?
barlop,

1
Devo dire che, leggendo la tua risposta, l'ho capito solo quando l'ho provato. Penso che un motivo per cui non hai ottenuto più voti, potrebbe essere che le persone non hanno capito la logica. Mi permetteresti di aggiungere una spiegazione della logica, alla tua risposta, all'inizio?
barlop,

3

No, non penso che ci sia. Il più vicino è il plug-in TextFx ma si tratta di un ordinamento basato sui caratteri non basato sulla lunghezza della linea. La soluzione migliore è quella di gettare il testo in un foglio di calcolo e ordinarlo lì (usando una colonna calcolata separata usando la LEN()funzione).


Grazie, il file di testo ha lunghe righe e dimensioni complessive enormi, quindi metto via gli editor di fogli di calcolo. Lasciami aggiornare la domanda.
hpaknia,

@HPM bene se sei disposto a guardare al di fuori di notepad ++, la riga di comando lo farebbe. come usare alcuni comandi per ottenere la lunghezza della riga alla fine di ogni riga. allora saresti almeno più vicino a farlo.
barlop

grazie, è un buon consiglio. Ciò di cui sono curioso è NP ++ molti plugin, perché questo non esiste?
hpaknia,

1

È possibile utilizzare SQL in N ++ nei file CSV! Ad esempio se hai:

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

, è possibile eseguire il comando select * from data order by length(col1) desc per ordinare in ordine decrescente. "dati" indica il file corrente. "col1" - nome della prima (e ultima) colonna.

Sfortunatamente esiste probabilmente un bug che non consente di abbandonare il delimitatore dopo le righe nel testo a una colonna.


Questa è in realtà un'ottima soluzione, se solo SQL in N ++ non ha manipolato l'output dei dati. Ho appena testato la tua soluzione e ho aggiunto delimitatori alla fine di tutte le righe con una rapida sostituzione regex, ma l'output dei dati converte tutto in minuscolo e ha sostituito i miei trattini con punti interrogativi.
Dane,

@Dane (al momento non ho accesso a Notepad ++.) Forse prova ad aggiungere una virgoletta all'inizio e alla fine di ogni riga (e poi il punto e virgola dopo)? Forse doppie virgolette?
Bob,

@Bob: non va bene. La cosa minuscola è anche menzionata nelle note di rilascio per il plug-in SQL in N ++.
Dane,

0

O se ti capita di avere Linux e nedit:

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

Non solo non è questa la domanda, ma non è nemmeno applicabile alla stessa piattaforma del sistema operativo.
Caleb,

è ancora una risposta utile. è stato l'unico che ha funzionato bene per me. ha specificato che hai bisogno di Linux e nedit, quindi non ci sono problemi.
Anthony,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.