subir - ¿Cómo puedo analizar archivos CSV en la línea de comandos de Linux?
subir archivo de excel ar (12)
Como lo sugiere @Jonathan en un comentario, hay un módulo para python que proporciona la herramienta de línea de comandos csvfilter. Funciona como corte, pero maneja correctamente las columnas de CSV:
csvfilter -f 1,3,5 in.csv > out.csv
Si tiene python (y debería), puede instalarlo simplemente así:
pip install csvfilter
Más información en https://github.com/codeinthehole/csvfilter/
¿Cómo puedo analizar archivos CSV en la línea de comandos de Linux?
Para hacer cosas como:
csvparse -c 2,5,6 filename
para extraer campos de las columnas 2, 5 y 6 de todas las filas.
Debería poder manejar el formato de archivo csv: http://tools.ietf.org/html/rfc4180 que significa que se deben citar los campos y escaparse de las comillas internas, según corresponda , para una fila de ejemplo con 3 campos:
field1,"field, number ""2"", has inner quotes and a comma",field3
de modo que si solicito el campo 2 para la fila anterior, obtengo:
field, number "2", has inner quotes and a comma
Aprecio que haya numerosas soluciones, perl, awk (etc.) para este problema, pero me gustaría una herramienta de línea de comandos bash nativa que no requiera que invoque otro entorno de scripting o escriba ningún código adicional (!).
Encontré que csvkit es útil, está basado en el módulo python csv y tiene bastantes opciones para analizar archivos csv complejos.
Aunque parece ser un poco lento. Estoy obteniendo 4MB / s (con 100% de CPU) al extraer un campo de una csv de 7GB con 5 columnas.
Para extraer la cuarta columna de file.csv
csvcut -c 4 file.csv
Esto suena como un trabajo para awk.
Lo más probable es que necesite escribir su propio script para sus necesidades específicas, pero this sitio tiene un diálogo sobre cómo hacerlo.
También puede usar la utilidad de corte para quitar los campos.
Algo como:
cut -f 2,5,6 -d , filename
donde el argumento -f es el campo que desea y -d es el delímetro que desea. Luego puede ordenar estos resultados, encontrar los únicos, o usar cualquier otra utilidad bash. Aquí hay un video genial sobre trabajar con archivos CSV desde la línea de comando. Solo alrededor de un minuto, echaría un vistazo.
Sin embargo, supongo que podría agrupar la utilidad de corte con awk y no querer usarla. En realidad, no sé a qué se refiere exactamente con el comando nativo bash, así que todavía lo sugeriré.
Mi editor de flujo CSV FOSS CSVfix hace exactamente lo que quieres. Hay un instalador binario para Windows y una versión compilable (a través de un archivo MAKE) para UNIX / Linux.
Mi reacción instintiva sería escribir un envoltorio de scripts alrededor del módulo csv de Python (si aún no existe tal cosa).
Para un envoltorio súper ligero alrededor del módulo csv
de Python, puedes mirar a pluckr .
Pruebe crush-tools , son excelentes para manipular datos delimitados. Suena exactamente lo que estás buscando.
Script Perl (requiere texto :: CSV_XS):
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my @opt_columns;
GetOptions("column=i@" => /@opt_columns)
or die "Failed parsing options/n";
die "Must give at least one --column/n" if int(@opt_columns) == 0;
@opt_columns = map { $_-1 } @opt_columns; # convert 1-based to 0-based
use Text::CSV_XS;
my $csv = Text::CSV_XS->new ( { binary => 1 } );
open(my $stdin, "<-") or die "Couldn''t open stdin/n";
open(my $stdout, ">-") or die "Couldn''t open stdout/n";
while (my $row = $csv->getline($stdin)) {
my @nrow = @{$row}[@opt_columns];
$csv->print($stdout, /@nrow);
print "/n";
}
Ponlo en un archivo csvcut.pl
.
Ejemplo de tomar solo las columnas 3 y 4:
cat foo.csv | ./csvcut.pl --c 3 --c 4
Esto solo citará columnas que necesiten cotizaciones, por lo que si una columna de entrada tiene "Barra" (con comillas) saldrá de Barra (sin comillas).
También escribí una de estas herramientas (solo UNIX) llamada csvprintf . También puede convertir a XML de forma online.
Un google rápido revela un script awk que parece manejar archivos csv.
csvtool es realmente bueno. Disponible en Debian / Ubuntu ( apt-get install csvtool
). Ejemplo:
csvtool namedcol Account,Cost input.csv > output.csv
Consulte la página del manual de CSVTool para obtener sugerencias de uso.
ffe
es otra gran herramienta. Requiere que cree un archivo de configuración para la mayoría de las tareas no triviales. Lo bueno es que es muy flexible y puede manejar todo tipo de estructura, lógica y formato que otras herramientas no pueden.
Me gusta usar csvtool
para trabajos rápidos y usar ffe
para trabajos complejos o trabajos que requieren frecuentes repeticiones.