Notepad ++ - Suppression de la première colonne d'un fichier séparé par des virgules


14

J'ai un gros fichier CSV dont j'ai besoin pour supprimer la première colonne de données. Je ne peux pas l'ouvrir dans Excel car Excel convertit certaines des valeurs des colonnes en nombres scientifiques.

J'utilise Notepad ++ , et j'essaie d'enchaîner la première colonne du fichier EXE,

1,Value1,value2,value3,value4,value5
3445,Value1,value2,value3,value4,value5
12345,Value1,value2,value3,value4,value5
1234,Value1,value2,value3,value4,value5
11,Value1,value2,value3,value4,value5

ressembler à

Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5

Réponses:


13

La recherche et le remplacement de Notepad ++ prennent en charge les expressions régulières (regex) qui peuvent être facilement utilisées pour cela.

Utilisez l'expression régulière suivante pour rechercher:

^[^,]+,(.+)

Cela correspond au début de la ligne suivi par autant de caractères que possible n'étant pas une virgule suivie d'une virgule suivie du reste de la ligne. Le reste de la ligne est regroupé en tant que premier sous-match.

Remplacez globalement par ceci:

\1

Cela indique le premier sous-match (reste de la ligne). Par cela, chaque ligne est remplacée par tout après la première colonne et la virgule.

Après avoir trouvé la façon ci-dessus de le faire dans un seul remplacement global (et mis à jour ma réponse en conséquence), j'ai remarqué que cette réponse est fondamentalement identique mais donne également une explication complète du regex utilisé.


Remarque: le regex plus court ^[^,]+,ne peut pas être utilisé pour le remplacement global par une chaîne vide car Notepad ++ remplacera alors toutes les colonnes sauf la dernière: après avoir remplacé la première colonne, la deuxième colonne (qui est maintenant la première et correspond exactement à l'expression régulière) être remplacé, puis le troisième, et ainsi de suite. Cependant, l'expression régulière plus courte fonctionne parfaitement avec d'autres éditeurs (par exemple avec PSPad ou vim ).


C'est la voie à suivre ici. Si l'OP a déjà N ++, c'est le moyen le plus rapide. Je fais beaucoup cela avec PSPad (qui pourrait le faire en une seule fois, btw). Consultez également le fonctionnement de l'expression rationnelle: rubular.com/r/OiehkBT0vA
simbabque

Notepad ++ ne traite pas l'entrée ligne par ligne, mais caractère par caractère. Cela a des avantages intéressants (comme les modèles multi-lignes).
Dennis

+1 pour l'édition. Malheureusement, votre réponse est maintenant wiki communautaire.
Dennis

@Dennis Oui, j'ai édité trop souvent car je n'étais pas au courant de la limite de 10 éditions.
speakr

Pourquoi pas ^[^,]+,et remplacer par vide?
knittl

10

Appuyez sur Ctrl+ Het effectuez le remplacement suivant:

Find what:          .*?,(.*)
Replace with:       \1
Wrap around:        checked
Regular expression: selected
. matches newline:  unchecked

Appuyez maintenant sur Alt+ Apour remplacer toutes les occurrences.

Comment ça fonctionne

  • L' expression régulière .*?,(.*) correspond à une ligne entière:

    • .*?, correspond à tout avant la première virgule, y compris la virgule elle-même.

      .*signifie n'importe quel nombre d'occurrences de n'importe quel caractère, et le point d'interrogation rend le quantificateur paresseux , c'est-à-dire qu'il correspond au moins de caractères possible.

    • (.*) correspond à tout après la première virgule.

      Le placer .*entre parenthèses le convertit en sous-modèle, de sorte que le mât est accessible dans le champ de remplacement.

  • \1représente le premier sous-match (correspond à (.*)).

    Par conséquent, Notepad ++ remplace la ligne par tout ce qui suit la première virgule.


Je viens d'avoir la même idée après avoir remarqué que ^[^,]+,globalement remplacé par une chaîne vide ne fonctionnera pas dans Notepad ++. (+1)
speakr

6

Sous Windows, vous pouvez le faire comme suit.

for /F "tokens=2,3,4,5,6 delims=," %i in (Input.csv) do @echo %i,%j,%k,%l,%m  >> output.csv

J'ai supposé que vous n'aviez que 6 colonnes. Si vous avez beaucoup plus de colonnes, essayez d'expérimenter * dans le champ des jetons. L'idée est tirée de Windows pour la commande


2
pour un nombre arbitraire de colonnes, utilisez ceci:for /F "tokens=1* delims=," %i in (Input.csv) do @echo %j >> output.csv
SeanC

3

En supposant que vous avez un système Linux ou un environnement de style Unix (j'aime gow , ou vous pouvez snarf les utilitaires hors unixutils ), je crois que l'exécution du fichier cut -d , -f2-6devrait faire l'affaire - il le devrait, si je me souviens bien fera l'affaire - -ddéfinit la délimiteur et f2-6imprime le deuxième au sixième caractère.

cat input.csv | cut -d , -f2-6 > output.csvferait l'affaire en prenant le fichier d'entrée et en supprimant un fichier de sortie. Il n'utilise pas le bloc-notes, mais c'est rapide et vraiment simple.


Merci, je viens de cliquer sur le lien et j'ai une erreur 403?
MikeD

les deux liens fonctionnent pour moi - ce qui est étrange. Je trouve généralement gow en recherchant sur Google - c'est sur un repo github appartenant à bmatzelle. Cygwin pourrait également être une option, mais c'est une surpuissance pour cette chose sorta
Journeyman Geek

2

Vous devriez être capable de charger le CSV dans Excel et de le faire traiter les nombres comme du texte (l'empêchant de se convertir en nombres scientifiques).

  1. Ouvrez Excel
  2. Onglet Données
  3. Du texte
  4. Choisissez délimité
  5. Choisissez Autre: ","
  6. Pour toutes les colonnes, sélectionnez-les dans la fenêtre Aperçu des données et choisissez Texte
  7. Supprimez votre colonne
  8. Enregistrer au format CSV

La modification et l'enregistrement de fichiers CSV dans Excel cassent souvent des nombres comme les codes EAN et les flotteurs de style américain dans Excel européen. Même si vous configurez tout lors de l'importation, il arrive que vous mangiez certaines choses. Je ne peux pas le recommander, mais cela fonctionnerait probablement. Dans un environnement productif, je déconseille cela.
simbabque

Cela a très bien fonctionné! Thnak you
MikeD

@simbabque Je dirais que c'est un peu injuste, je l'ai utilisé avec succès dans des environnements de production pour de grands ensembles de données qui nécessitaient une manipulation - certes, c'était parfois un cauchemar. Excel a l'habitude de modifier les données de manière inattendue, mais je ne dirais pas que ce risque était particulièrement plus important que d'autres approches.
James Wood

Je l'utilise aussi à l'occasion, mais la plupart du temps, je n'aime pas le faire. Il est souvent beaucoup plus rapide d'utiliser un éditeur de texte qui prend en charge la recherche et le remplacement d'expressions régulières si l'on sait comment le gérer. Aucune infraction, cependant, car votre réponse était claire et concise.
simbabque

oi ne s'en offusquait pas: D
James Wood

1

Notepad ++ a une édition de colonnes intégrée et une commande Line Up by (,) (plugin TextFX) donnant une solution graphique de pointer-cliquer qui est probablement la première fois. Cela évite d'avoir à utiliser des expressions régulières ou une programmation shell, qui nécessitent généralement un débogage jusqu'à ce qu'elles fassent exactement ce que vous voulez et rien de plus.

Point de départ : fichier CSV avec des colonnes mal alignées, donc pas facile à éditer par colonne ...

    1,Value1,value2,value3,value4,value5
    3445,Value1,value2,value3,value4,value5
    12345,Value1,value2,value3,value4,value5
    1234,Value1,value2,value3,value4,value5
    11,Value1,value2,value3,value4,value5
    ...

Procédure:

  1. Sélectionnez les lignes d'intérêt - peut-être l'intégralité du fichier.

  2. Utilisez la commande de menu TextFX> TextFX Edit> Aligner plusieurs lignes par virgule (,) Cela aligne toutes les lignes par colonne et facilite l'édition des colonnes.

    1    ,Value1,value2,value3,value4,value5
    3445 ,Value1,value2,value3,value4,value5
    12345,Value1,value2,value3,value4,value5
    1234 ,Value1,value2,value3,value4,value5
    11   ,Value1,value2,value3,value4,value5
    
  3. Entrez en mode colonne dans la colonne après la première virgule (,) Pour un petit nombre de lignes, utilisez les commandes du clavier: Alt + Maj + Flèche bas.
    Si vous devez travailler sur plusieurs lignes (fichier volumineux), utilisez Alt + souris et cliquez sur la colonne souhaitée de la première ligne, puis passez à la dernière ligne du fichier et Alt + Maj + cliquez sur la même position de colonne. Cela active le mode colonne sur le fichier ENTIER - vous devriez voir une ligne verticale derrière toutes les virgules.

  4. Supprimer en mode colonne supprime une colonne entière de caractères. Vous pouvez donc tout supprimer en une seule fois avant la première virgule dans toutes les lignes pour obtenir:

    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    

Terminé!

Remarquez cette solution par rapport aux différentes autres proposées jusqu'à présent:

L'édition en mode colonne est assez puissante et, lorsqu'elle est combinée avec les options du plugin TextFX, s'applique à une variété de situations de manière ponctuelle et rapide.

Par exemple, si vous avez décidé de supprimer la 2e colonne ou la Ne colonne rapidement, cette approche fonctionne sans presque aucune modification.

Les expressions régulières, les scripts shell, en revanche, atteindront l'objectif, oui, mais dans les problèmes complexes, vous passerez plus de temps à "déboguer" votre syntaxe.

La fonctionnalité intégrée polyvalente de Notepad ++ est l'une de ses principales forces: vous obtenez pas mal de puissance sans avoir à recourir à la "programmation".


0

Si vous connaissez le plugin de la console Python pour Notepad ++, je peux vous conseiller une autre méthode. Vous devez ajouter votre texte sur le document Notepad ++ et exécuter le script suivant dans la console:

res = []
data = editor.getText().split('\r\n')
for i in data:
    res.append(i.split(',')[1:])

for i in res:
    editor.addText(', '.join(i)+'\r\n')

Ce script a ajouté le texte du résultat à votre document Notepad ++ actuel.


-1

Exécuter vim(en mode commande, sinon appuyer sur Echap).

Tapez la commande suivante pour mapper l'action de suppression de la première colonne à la qclé:

:map q 0df,j0

Ce qui signifie:

  • 0 - aller au début de la ligne
  • df,- d tout elete jusqu'à , le caractère (y compris par des virgules),
  • j - descendre une ligne
  • 0 - aller au début de la ligne

Appliquez ensuite cette action à toutes les lignes:

:0,$ normal q

Cela signifie que vous exécutez l'action qui est affectée à la clé qdu début (0) à la fin ($).


Pourquoi ne pas faire un seul remplacement global avec :%s/^[^,]\+,//g?
speakr

Vous pourriez aussi bien, celui-ci est facile à utiliser et à comprendre plutôt que regex :) Habituellement, je suis toujours confus quel caractère je dois échapper, donc je termine en tapant le même regex plusieurs fois.
kenorb
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.