Comment puis-je supprimer les lignes en double dans Visual Studio Code?

118

Disons que vous avez le texte suivant:

abc
123
abc
456
789
abc
abc

Je veux supprimer toutes les lignes "abc" et n'en garder qu'une. Cela ne me dérange pas de trier. Le résultat devrait être comme ceci:

abc
123
456
789
Younes
la source

Réponses:

224

Si l'ordre des lignes n'est pas important

Triez les lignes par ordre alphabétique, si elles ne le sont pas déjà, et procédez comme suit:
(sur la base de cette question connexe: Comment rechercher et supprimer les lignes en double d'un fichier à l'aide d'expressions régulières? )

  1. Control+F

  2. Basculer en "mode Remplacer"

  3. Basculer "Utiliser l'expression régulière" (l'icône avec le .*symbole)

  4. Dans le champ de recherche , saisissez^(.*)(\n\1)+$

  5. Dans le champ " remplacer par ", saisissez$1

  6. Cliquez sur le bouton Remplacer tout(«Tout remplacer»).

Si l'ordre des lignes est important et que vous ne pouvez pas trier

Dans ce cas, soit recourir à une solution en dehors de VS Code (voir ici ), soit - si votre document n'est pas très volumineux et que cela ne vous dérange pas de spammer le bouton Remplacer tout - suivez les étapes précédentes, mais aux étapes 4 et 5, entrez-les:
(basé sur Supprimer des lignes en double spécifiques sans trier )

Attention: Blocs pour les fichiers avec trop de lignes (1000+); peut provoquer le blocage de VS Code; peut introduire des lignes vides dans certains cas.

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

  • remplacer par :$1

puis cliquez sur le bouton "Tout remplacer" autant de fois qu'il y a des occurrences en double .

Vous saurez que c'est suffisant lorsque le nombre de lignes cesse de diminuer lorsque vous cliquez sur le bouton. Accédez à la dernière ligne du document pour garder un œil sur cela.

Marc 2377
la source
4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?fait mon crash vscode .... J'ai fait une recherche dans un fichier 229 lignes. :(
Hickory420
@ Hickory420 J'ai testé dans ma machine avec 1000 lignes (20 caractères de long, aléatoires) et je n'ai eu aucun crash, mais effectivement un thread bloque avec une charge de processeur à 100% pendant quelques secondes à chaque passage. Ouais, ce n'est guère pratique pour les gros fichiers.
Marc 2377
Merci pour cela. Pouvez-vous s'il vous plaît expliquer l'expression régulière ^(.*)(\n\1)+$. Après avoir supprimé les lignes en double, je veux regarder toutes les lignes avec la première colonne en double dans le csv et je veux modifier l'expression régulière.
Urvah Shabbir
1
Wow, je sens que je suis assez bon en regex et cela m'a toujours époustouflé, bonne réponse !!
electrovir le
@UrvahShabbir, une explication de ce morceau de regex est donnée dans les questions / réponses liées . La mienne est seulement différente en ce que le \r?bit de l'autre réponse n'est pas vraiment nécessaire.
Marc 2377
66

Voici une extension très intéressante: Transformer

Fonctionnalités:

  • Lignes uniques
  • Lignes uniques comme nouveau document
  • Filtrer les lignes
  • Filtrer les lignes comme nouveau document
  • Trier les lignes
  • Trier les lignes par longueur
  • Aligner sur le curseur
  • Aligner CSV
  • CSV compact
  • Copier dans un nouveau document
  • Sélectionnez des lignes
  • Lignes comme JSON
  • Lignes de coupe
  • Compter les lignes en double comme nouveau document
  • Macros

Pour supprimer les lignes en double:

  • Supprime les lignes en double du document

  • Fonctionne sur sélection ou bloc courant si aucune sélection

Je n'ai pas beaucoup joué avec la commande "Unique Lines", mais cela semble assez bien fait (y compris essayer un enregistreur de macro!).

marque
la source
26

A ajouter à la réponse de @ Marc.2377.

Si l'ordre est important et que vous ne vous souciez pas de ne conserver que la dernière des lignes dupliquées, recherchez simplement l'expression rationnelle suivante si vous souhaitez supprimer uniquement les lignes non vides dupliquées

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

Si vous souhaitez également supprimer les lignes vides en double, utilisez à la *place de+

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

et remplacer par rien.

Capture d'écran de la zone de recherche et de remplacement remplie

Cela prendra une ligne et essaiera de trouver quelques lignes supplémentaires (peut-être 0) suivies de la même ligne prise. Cela supprimera la ligne prise.

Ceci est juste une regex one-shot. Pas besoin de spammer le bouton de remplacement.

Skeeve
la source
Nicely succinct
angus l
4
Agréable. Je recommande à la ^(.+\n)(?=(?:.*\n)*?\1)place parce que votre regex a supprimé une ligne vide là où elle n'était pas attendue. J'ai quand même voté.
Marc 2377
Bonne prise ... OTOH: les lignes vides en double sont également des doublons;)
Skeeve
1
@Skeeve Allez, c'est juste un petit merci pour votre réponse utile et tout pour une meilleure communauté :)
Zaman
1
xxx(?=…)est un match anticipé. Il s'assure donc que tout ce qui suit "xxx" correspond à "…", mais ne fait pas avancer la recherche. (?:…)est juste une parenthèse qui ne compte pas dans le nombre de parenthèses. .*\nest un motif pour une ligne (éventuellement vide). *signifie qu'il peut y avoir plusieurs lignes, voire aucune. L' ?après astérisque ( *) signifie que nous voulons le moins de lignes possible. Comme \1suit cette expression, l'effet est que nous recherchons toutes les lignes qui ne correspondent pas \1jusqu'à ce que nous trouvions une ligne correspondant \1. J'espère que cela le rend clair.
Skeeve le
22

J'ai juste eu le même problème et j'ai trouvé le package Visual Studio Code "Sort lines". Consultez la place de marché Visual Studio Code pour plus de détails (par exemple, Trier les lignes ).

Ce package a l'option "Tri des lignes (uniques)", qui l'a fait pour moi. Faites attention aux espaces blancs au début / à la fin des lignes. Ils déterminent si les lignes sont considérées comme uniques ou non.

SimonAx
la source
marketplace.visualstudio.com/ ... devrait également fonctionner.
kcpr
1
Il semble que l'extension n'ait plus la capacité de supprimer les entrées en double. Le combiner avec la réponse de @ Marc-2377 semble faire l'affaire pour moi.
Dan Atkinson
12

Installez l' extension DupChecker , appuyez sur F1et tapez "Vérifier les doublons".

Il recherchera les doublons et vous demandera si vous souhaitez les supprimer.

perfecto25
la source
11

Essayez de rechercher et de remplacer par une expression régulière .

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

  • Remplacer: $1$2

Il est possible d'introduire une certaine variance dans le premier groupe.

Lavock
la source
-3

Pas réellement dans Visual Studio Code, mais si cela fonctionne, cela fonctionne.

  1. Ouvrez une nouvelle feuille de calcul Excel
  2. Collez les données dans une colonne
  3. Allez dans l' onglet Données
  4. Sélectionnez la colonne de données (si vous ne l'avez pas déjà fait)
  5. Cliquez sur Supprimer les doublons (quelque peu au milieu de la barre)
  6. Cliquez OKpour supprimer les doublons.

Ce n'est pas la meilleure réponse, comme vous l'avez spécifié Visual Studio Code, mais comme je l'ai dit: si cela fonctionne, cela fonctionne :)

NostraDavid
la source
Vous pouvez le rendre plus pertinent en fournissant un script qui peut être appelé directement à partir de Visual Studio Code. Dans les mots d'ordre, automatise ce processus. Je ne sais pas si c'est possible, mais un script qui invoquerait Excel via ses interfaces COM exposées. Cela rendrait cette réponse beaucoup plus précieuse car ce serait un exemple de tirer parti d'autres applications pour faire des choses intéressantes.
Peter Mortensen