2009-09-08 98 views
13

Tengo un conjunto de archivos csv (alrededor de 250), cada uno con 300 a 500 registros. Necesito cortar 2 o 3 columnas de cada archivo y almacenarlo en otro. Estoy usando ubuntu OS. ¿Hay alguna forma de hacerlo en comando o utilidad?cómo cortar columnas de csv

Respuesta

22

Si sabe que el delimitador de columna no se produce dentro de los campos, puede usar cortar.

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

Puede usar el shell buildin 'for' para recorrer todos los archivos de entrada.

+2

Puede procesar todos los archivos con algo así como: encontrar "* .csv" | xargs cut -d, -f2,3> out.csv – pixelbeat

+2

Puedes usar la opción '--output-delimiter = STRING' de' cut' si quieres deshacerte de la coma o cambiarla por otra cosa. –

+14

El principal problema con esta respuesta es que 'cut' no maneja los campos entrecomillados que incluyen el delimitador. Si su archivo CSV tiene datos que hacen esto, necesitará usar algo más. –

9

Si los campos pueden contener el delimitador, debe encontrar una biblioteca que pueda analizar archivos CSV. Normalmente, los lenguajes de scripting de propósito general incluirán un módulo CSV en su biblioteca estándar.

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

Si sus campos contienen comas o saltos de línea, se puede utilizar un programa de ayuda que escribí para permitir corte (y otras herramientas de procesamiento de texto UNIX) para trabajar correctamente con los datos.

https://github.com/dbro/csvquote

Este programa encuentra caracteres especiales dentro de los campos citados, y temporalmente los reemplaza con los caracteres no imprimibles que no confundirán al programa de corte. Luego se restauran después de que el corte está hecho.

solución Lutz' se convertiría en:

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

Sí, funcionó muy bien para mí: https://stackoverflow.com/questions/17199311/how-to-delete-a-column-columns-of-a-csv-file-which-has-cell-values-with una cadena/29134579 # 29134579 – nono

0

Si utilizó ssconvert para obtener el CSV puede probar:

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

Aviso del extensión TXT lugar CSV, de esta manera se use Gnumeric_stf: stf_assistant exportador en lugar de Gnumeric_stf: stf_csv, que le permite usar opciones (parámetro -O). De lo contrario, obtendrá un El protector de archivos no toma el error de las opciones. El carácter de la tubería es mucho más improbable, pero es posible que desee comprobarlo antes.

A continuación, puede cambiar el nombre de él y hacer cosas como:

cat file.csv | cut -d "|" -f3 | sort | uniq -c | sort -rn | head 
Cuestiones relacionadas