2009-09-08 6 views
13

J'ai un ensemble de fichiers csv (environ 250), chacun ayant 300 à 500 dossiers. J'ai besoin de couper 2 ou 3 colonnes de chaque fichier et de le stocker dans un autre. J'utilise ubuntu OS. Y at-il un moyen de le faire dans le commandement ou l'utilité?comment couper des colonnes de csv

Répondre

22

Si vous savez que le délimiteur de colonne ne se trouve pas dans les champs, vous pouvez utiliser cut.

$ cat in.csv 
foo,bar,baz 
qux,quux,quuux 
$ cut -d, -f2,3 < in.csv 
bar,baz 
quux,quuux 

Vous pouvez utiliser le shell shellin 'for' pour effectuer une boucle sur tous les fichiers d'entrée.

+2

Vous pouvez traiter de manière évolutive tous les fichiers avec quelque chose comme: trouver "* .csv" | xargs cut -d, -f2,3> out.csv – pixelbeat

+2

Vous pouvez utiliser l'option '--output-delimiter = STRING' de' cut' si vous voulez vous débarrasser de la virgule ou la changer en quelque chose d'autre. –

+14

Le principal problème de cette réponse est que 'cut' ne gère pas les champs entre guillemets qui incluent le délimiteur. Si votre fichier CSV contient des données, vous devrez utiliser autre chose. –

9

Si les champs peuvent contenir le délimiteur, vous devez trouver une bibliothèque capable d'analyser les fichiers CSV. Généralement, les langages de script généraux incluent un module CSV dans leur bibliothèque standard.

Ruby: require 'csv' 
Python: import csv 
Perl: use Text::ParseWords; 
8

Si vos champs contiennent des virgules ou des sauts de ligne, vous pouvez utiliser un programme d'aide je l'ai écrit pour permettre coupé (et d'autres outils de traitement de texte UNIX) pour fonctionner correctement avec les données.

https://github.com/dbro/csvquote

Ce programme trouve des caractères spéciaux dans les domaines cités, et les remplace temporairement avec des caractères non imprimables qui ne confondra pas le programme de coupe. Ensuite, ils sont restaurés après la coupe est terminée.

lutz » solution deviendrait:

csvquote in.csv | cut -d, -f2,3 | csvquote -u 
+0

Oui cela a très bien fonctionné pour moi: https://stackoverflow.com/questions/17199311/how-to-delete-a-column-columns-of-a-csv-file-which-has-cell-values-with -a-string/29134579 # 29134579 – nono

0

Si vous avez utilisé ssconvert pour obtenir le CSV, vous pouvez essayer:

ssconvert -O 'separator="|"' "file.xls" "file.txt" 

Notez que le TXT l'extension à la place CSV, cette façon utiliser Gnumeric_stf: stf_assistant exportateur au lieu de Gnumeric_stf: stf_csv, qui vous permet d'utiliser les options (paramètre -O). Sinon, vous obtiendrez un L'économiseur de fichier ne prend pas les options erreur. Le personnage de pipe est beaucoup plus improbable, mais vous pourriez vouloir vérifier avant.

Ensuite, vous pouvez le renommer et faire des choses comme:

cat file.csv | cut -d "|" -f3 | sort | uniq -c | sort -rn | head 
Questions connexes