Tengo varios archivos CSV grandes y me gustaría tenerlos en TSV (formato separado por tabulaciones). La complicación es que hay comas en los campos del archivo CSV, por ejemplo:
A,,C,"D,E,F","G",I,"K,L,M",Z
Rendimiento esperado:
A C D,E,F G I K,L,M Z
(donde los espacios en blanco en el medio son pestañas "duras")
Tengo Perl, Python y coreutils instalados en este servidor.
text-processing
python
perl
csv-simple
Corazón oscuro
fuente
fuente
Respuestas:
Pitón
Agregar al archivo nombrado
csv2tab.sh
y hacerlo ejecutablePruebas de funcionamiento
fuente
csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))
? Elimina el bucle también.python -c 'import csv,sys; csv.writer(sys.stdout, dialect="excel-tab").writerows(csv.reader(sys.stdin))'
. Dudo-m
que funcione de esa manera.Para la diversión,
sed
.Si su
sed
no es compatible-E
, intente con-r
. Sised
no admite\t
una pestaña literal, intente colocar una pestaña literal (en muchos shells, ctrl- v tab) o en Bash, use una$'...'
cadena de estilo C (en cuyo caso la barra invertida\2
debe duplicarse). Si desea mantener las comillas, use en\1
lugar de\2
(en cuyo caso el par de paréntesis interno es inútil y puede eliminarse).Esto no intenta manejar comillas dobles escapadas dentro de comillas dobles; algunos dialectos CSV respaldan esto al duplicar la cita doble (sic) citada.
fuente
Usando la
csvkit
utilidad (Python), por ejemplo:Hace streaming, con citas y escapes CSV y TSV correctos
Está en apt y otros gestores de paquetes
fuente
Una opción podría ser el módulo Text :: CSV de perl, p. Ej.
demostrar
fuente
Perl
Awk
Resultado:
fuente
La solución termonuclear flyswatter debe estar usando libreoffice. Mientras que https://ask.libreoffice.org/en/question/19042/is-is-possible-to-convert-comma-separated-value-csv-to-tab-separated-value-tsv-via-headless-mode / sugiere que esto no es posible pero está mal (¿o simplemente está desactualizado?) y el siguiente comando funciona en mi 5.3 .:
loffice "-env:UserInstallation=file:///tmp/LibO_Conversion" --convert-to csv:"Text - txt - csv (StarCalc)":9,34,UTF8 --headless --outdir some/path --infilter='csv:44,34,UTF8' *.csv
se
env
podría omitir el argumento, pero de esta forma los documentos no aparecerán en su documento reciente.fuente
Si tiene, o puede instalar, la
csvtool
utilidad:Tenga en cuenta que por alguna razón
csvtool
no tiene una página de manual, perocsvtool --help
imprimirá un par de cientos de líneas de documentación.fuente
Usar
mlr
es casi sucinto, pero deshabilitar los encabezados requiere opciones largas:Salida:
fuente
Soy autor de un convertidor CSV a TSV de código abierto que maneja las transformaciones descritas. Es bastante rápido, puede valer la pena echarle un vistazo si hay una necesidad continua de convertir grandes archivos CSV. La herramienta es parte del kit de herramientas de utilidades TSV de eBay (documentación de csv2tsv aquí ). Las opciones predeterminadas son suficientes para la entrada descrita:
fuente
Empuje
Solo por diversión, las sustituciones de expresiones regulares se pueden realizar en Vim . Aquí hay una posible solución de cuatro líneas, adaptada de: /programming/33332871/remove-all-commas-between-quotes-with-a-vim-regex
Las comillas se eliminan.
Para escribir un poco la solución, las cuatro líneas anteriores (sin dos puntos principales) se pueden guardar en un archivo, por ejemplo
to_tsv.vim
. Abra cada CSV para editar con Vim ysource
elto_tsv.vim
script en la línea de comando de Vim (adaptado de /programming/3374179/run-vim-script-from-vim-commandline/8806874#8806874 ):fuente
Aquí está el ejemplo de convertir CSV en TSV usando la
jq
utilidad :o:
Sin embargo, el formato CSV debe estar bien formateado, por lo que cada cadena debe ser citada.
Fuente: formato de salida TSV simple .
fuente
Con
perl
, suponiendo que los campos csv no tengan incrustadas"
o nuevas líneas o pestañas:fuente
Lo siguiente es simplemente una corrección a la respuesta de @tripleee para que elimine las comillas del campo final tal como lo hace con todos los demás campos.
Para mostrar lo que se está corrigiendo, a continuación se muestra la respuesta de un triplicado , más una ligera modificación a los datos de ejemplo del OP con citas agregadas alrededor del campo ' Z ' final .
Puede ver que ' Z ' se deja entre comillas. Esto es diferente a cómo se manejan los campos internos. Por ejemplo, la ' G ' no tiene comillas.
El siguiente comando usa una segunda sustitución para limpiar la columna final:
fuente
'A,,C,"D,E,F","G",I,"K,L,M","Z,A"'
se ingresan a esta respuesta, entonces"Z,A"
se reemplaza incorrectamente conZ A
, en lugar de la correctaZ,A
.