Come posso rimuovere le righe duplicate in Visual Studio Code?


118

Supponi di avere il seguente testo:

abc
123
abc
456
789
abc
abc

Voglio rimuovere tutte le righe "abc" e solo mantenerne una. Non mi dispiace smistare. Il risultato dovrebbe essere così:

abc
123
456
789

Risposte:


223

Se l'ordine delle righe non è importante

Ordina le righe in ordine alfabetico, se non lo sono già, ed esegui questi passaggi:
(in base a questa domanda correlata: come faccio a trovare e rimuovere le righe duplicate da un file utilizzando le espressioni regolari? )

  1. Control+F

  2. Attiva "Modalità di sostituzione"

  3. Attiva / disattiva "Usa espressioni regolari" (l'icona con il .*simbolo)

  4. Nel campo di ricerca , digita^(.*)(\n\1)+$

  5. Nel campo " sostituisci con ", digita$1

  6. Fare clic su il pulsante Sostituisci tutto("Sostituisci tutto").

Se l'ordine delle righe è importante, non puoi ordinare

In questo caso, ricorri a una soluzione al di fuori di VS Code (vedi qui ) oppure, se il tuo documento non è molto grande e non ti dispiace inviare spam al pulsante Sostituisci tutto, segui i passaggi precedenti, ma nei passaggi 4 e 5, inserisci questi:
(basato su Rimuovi righe duplicate specifiche senza ordinamento )

Attenzione: blocchi per file con troppe righe (1000+); può causare l'arresto anomalo di VS Code; può introdurre righe vuote in alcuni casi.

  • cerca :((^[^\S$]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\n)?

  • sostituire con :$1

e quindi fare clic sul pulsante "Sostituisci tutto" tante volte quante sono le occorrenze duplicate .

Saprai che è sufficiente quando il conteggio delle righe smette di diminuire quando fai clic sul pulsante. Passa all'ultima riga del documento per tenerlo d'occhio.


4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?ha fatto il mio vscode crash .... Ho fatto una ricerca in un file 229 righe. :(
Hickory420

@ Hickory420 Ho provato sulla mia macchina con 1000 righe (20 caratteri, casuali) e non ho avuto crash, ma in effetti un thread si blocca con il 100% di carico della CPU per alcuni secondi ad ogni passaggio. Sì, questo non è affatto pratico per file di grandi dimensioni.
Marc 2377

Grazie per questo. Puoi per favore spiegare la regex ^(.*)(\n\1)+$. Dopo aver rimosso le righe duplicate, voglio guardare tutte le righe con la prima colonna duplicata nel CSV e voglio modificare la regex.
Urvah Shabbir il

1
Wow, mi sento abbastanza bravo con le espressioni regolari e questo mi ha ancora lasciato a bocca aperta, ottima risposta !!
electrovir

@UrvahShabbir, una spiegazione per quel pezzo di regex è fornita nella sezione Domande e risposte collegate . La mia è diversa solo in quanto il \r?bit dell'altra risposta non è realmente necessario.
Marc 2377,

66

Ecco un'estensione molto interessante: Transformer

Caratteristiche:

  • Linee uniche
  • Linee uniche come nuovo documento
  • Linee di filtro
  • Filtra righe come nuovo documento
  • Ordina linee
  • Ordina righe per lunghezza
  • Allinea al cursore
  • Allinea CSV
  • CSV compatto
  • Copia in nuovo documento
  • Seleziona Linee
  • Linee come JSON
  • Linee di taglio
  • Conta righe duplicate come nuovo documento
  • Macro

Per rimuovere le righe duplicate:

  • Rimuove le righe duplicate dal documento

  • Funziona sulla selezione o sul blocco corrente se nessuna selezione

Non ci ho giocato molto a parte il comando "Linee uniche" ma sembra abbastanza ben fatto (incluso il tentativo di un registratore di macro!).


26

Da aggiungere alla risposta di @ Marc.2377.

Se l'ordine è importante e non ti interessa tenere solo l'ultima delle righe duplicate, cerca semplicemente la seguente espressione regolare se desideri rimuovere solo le righe duplicate non vuote

^(.+\n)(?=(?:.*\n)*?\1)

Se vuoi rimuovere anche le righe vuote duplicate, usa *invece di+

^(.*\n)(?=(?:.*\n)*?\1)

e sostituire con niente.

Screenshot della casella di ricerca e sostituzione piena

Questo richiederà una linea e proverà a trovare altre (forse 0) linee seguite dalla stessa identica linea presa. Rimuoverà la linea presa.

Questa è solo una regex one-shot. Non è necessario inviare spam al pulsante di sostituzione.


Ben succinto
angus l

4
Bello. Lo consiglio ^(.+\n)(?=(?:.*\n)*?\1)invece perché la tua regex ha rimosso una riga vuota dove non era previsto. Votato comunque.
Marc 2377

Buona cattura ... OTOH: anche le righe vuote duplicate sono duplicati;)
Skeeve

1
@Skeeve Andiamo, questo solo un piccolo grazie per la tua risposta utile e tutto per una community migliore :)
Zaman

1
xxx(?=…)è una partita anticipata. Quindi si assicura che, qualunque cosa segue "xxx" corrisponda a "...", ma non avanza la ricerca. (?:…)è solo una parentesi che non conta nel conteggio delle parentesi. .*\nè un modello per una riga (possibilmente vuota). *significa che possono esserci più righe, anche nessuna. Il ?dopo l'asterisco ( *) significa che vogliamo il minor numero di righe possibile. Come \1segue questa espressione l'effetto è che guardiamo avanti per tutte le linee che non corrispondono \1fino a quando non troviamo una linea corrispondente \1. Spero che questo lo renda chiaro.
Skeeve

22

Ho appena avuto lo stesso problema e ho trovato il pacchetto di Visual Studio Code "Ordina righe". Vedere il marketplace di Visual Studio Code per i dettagli (ad es. Linee di ordinamento ).

Questo pacchetto ha l'opzione "Linee di ordinamento (uniche)", che lo ha fatto per me. Prenditi cura di eventuali spazi bianchi all'inizio / alla fine delle righe. Influenzano il fatto che le linee siano considerate uniche o meno.



1
Sembra che l'estensione non sia più in grado di rimuovere le voci duplicate. Combinarlo con la risposta di @ Marc-2377 sembra fare il trucco per me.
Dan Atkinson

12

Installa l' estensione DupChecker , premi F1e digita "Check Duplicates".

Verificherà la presenza di duplicati e ti chiederà se desideri rimuoverli.


11

Prova a trovare e sostituire con un'espressione regolare .

  • Trova: ^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$

  • Sostituire: $1$2

È possibile introdurre qualche varianza nel primo gruppo.


-3

Non in realtà in Visual Studio Code, ma se funziona, funziona.

  1. Apri un nuovo foglio di calcolo Excel
  2. Incolla i dati in una colonna
  3. Vai alla scheda Dati
  4. Seleziona la colonna di dati (se non l'hai già fatto)
  5. Fai clic su Rimuovi duplicati (un po 'al centro della barra)
  6. Fare clic OKper rimuovere i duplicati.

Non è la risposta migliore, come hai specificato Visual Studio Code, ma come ho detto: se funziona, funziona :)


Puoi renderlo più pertinente fornendo uno script che può essere chiamato direttamente da Visual Studio Code. In altre parole, automatizza questo processo. Non so se sia possibile, ma uno script che richiamerebbe Excel attraverso le sue interfacce COM esposte. Ciò renderebbe questa risposta molto più preziosa in quanto sarebbe un esempio di utilizzo di altre applicazioni per fare cose pulite.
Peter Mortensen,
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.