Remplacement du trait de soulignement par une virgule et suppression des guillemets doubles dans CSV

10

J'ai un fichier CSV en tant que

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. etc.

J'ai besoin de convertir ce fichier CSV en

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85
RKR
la source

Réponses:

24

La manière la plus simple est d'utiliser tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

La façon dont cela fonctionne est qu'il trfaut deux arguments - ensemble de caractères à remplacer et leur remplacement. Dans ce cas, nous n'avons que des ensembles de 1 caractère. Nous redirigeons le flux stdin de l' input.csventrée trvia l' <opérateur shell et redirige la sortie résultante vers tr -d '"'pour supprimer les guillemets doubles.

Mais awkpeut aussi le faire.

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

La façon dont cela fonctionne est légèrement différente: awk lit chaque fichier ligne par ligne, chaque script en ligne étant /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Ici, nous n'avons pas de modèle, cela signifie donc exécuter le bloc de code pour chaque ligne. gsub()La fonction est utilisée pour la substitution globale au sein d'une ligne, nous l'utilisons donc pour remplacer les traits de soulignement par des virgules et les guillemets doubles par une chaîne nulle (en supprimant efficacement le caractère). Le 1est à la place de la correspondance de modèle avec le bloc de code manquant, qui par défaut est simplement d'imprimer la ligne; en d'autres termes, le bloc de code avec gsub()fait le travail et 1imprime le résultat.

Utilisez la redirection shell ( >) pour envoyer la sortie vers un nouveau fichier:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv
Sergiy Kolodyazhnyy
la source
Excuses.Je voulais aussi supprimer les virgules inversées aussi.J'ai mis à jour la question
RKR
@RKR Réponse mise à jour en conséquence, la réponse d'Ian est également mise à jour
Sergiy Kolodyazhnyy
13

Comme alternative, vous pouvez également utiliser cette sedcommande:

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
IanC
la source
1
Dans les guillemets simples, vous n'avez pas besoin d'échapper à un guillemet double.
glenn jackman
En effet @glennjackman! Je viens de supprimer la barre oblique inversée qui s'échappe
IanC
10

Perl, la "tronçonneuse de l'armée suisse" du traitement de texte en ligne de commande, peut également le faire. La syntaxe est (pas par coïncidence) assez similaire aux exemples tret sed:

perl -pe 'tr/_"/,/d' input.csv > result.csv

ou:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

Mais honnêtement, si vous ne voulez pas prendre le temps d'apprendre un nouveau langage de programmation (ce qui est vraiment ce que sont awk, Perl et sed et d'autres outils comme eux) juste pour cette tâche de base, vous pouvez tout aussi bien le faire dans tout éditeur de texte prenant en charge la recherche et le remplacement:

  1. Ouvrez le fichier CSV dans votre éditeur de texte préféré (comme gedit, kate, mousepad, etc.; même le vieux bloc-notes ou Wordpad sur Windows peut le faire).

  2. Sélectionnez "Rechercher et remplacer" dans le menu (généralement trouvé sous "Modifier", s'il n'y a pas de menu "Rechercher" distinct).

  3. Entrez _dans la zone de recherche et ,dans la zone de remplacement.

  4. Cliquez sur "Remplacer tout".

  5. Répétez avec "dans la zone de recherche et rien dans la zone de remplacement.

  6. Enregistrez le fichier.

Maintenant, si vous devez le faire pour 100 ou 1 000 fichiers au lieu d'un seul, alors l'apprentissage d'un nouvel outil en ligne de commande commence à avoir du sens. Et, bien sûr, une fois que vous savez utiliser Perl ou sed ou autre, vous économiserez beaucoup de temps et d'efforts avec des tâches similaires plus tard. Mais pour un travail ponctuel que vous ne vous attendez pas à devoir refaire, parfois un outil interactif de base comme un éditeur de texte est la solution la plus simple.

Ilmari Karonen
la source
3

Vous pouvez également le faire avec vim.

Ouvrez le fichier:, vim input.csvpuis utilisez viml'outil de recherche avancée de s. Tapez colon ( :) pour passer en mode commande et exécutez des commandes comme celle-ci:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

À peu près les mêmes commandes que dans la réponse d'IanC, mais à l'intérieur vimau lieu d'utiliser sed.

Point d'interrogation
la source
2

Pourquoi ne pas simplement modifier les valeurs par défaut des valeurs de séparateur d'entrée et de sortie

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
antuan sehikyan
la source