significado - forma más rápida de convertir archivo delimitado por tabulaciones a csv en linux
csv significado (9)
Tengo un archivo delimitado por tabuladores que tiene más de 200 millones de líneas. ¿Cuál es la forma más rápida en Linux para convertir esto a un archivo csv? Este archivo tiene varias líneas de información de encabezado que tendré que quitar en el futuro, pero se conoce el número de líneas de encabezado. He visto sugerencias para sed
y gawk
, pero me pregunto si hay una opción "preferida".
Solo para aclarar, no hay pestañas incrustadas en este archivo.
¡La solución de pitón de @ ignacio-vazquez-abrams es genial! Para las personas que buscan analizar delimitadores de otra pestaña, la biblioteca en realidad le permite establecer delimitadores arbitrarios. Aquí está mi versión modificada para manejar archivos delimitados por tuberías:
import sys
import csv
pipein = csv.reader(sys.stdin, delimiter=''|'')
commaout = csv.writer(sys.stdout, dialect=csv.excel)
for row in pipein:
commaout.writerow(row)
Creo que es mejor no robar el archivo porque puede crear un problema en el caso de un archivo grande. La mejor manera puede ser
$ tr '','' ''/t'' < csvfile.csv > tabdelimitedFile.txt
El comando obtendrá la entrada de csvfile.csv y almacenará el resultado como una pestaña separada en tabdelimitedFile.txt
Si le preocupan las comas incrustadas, deberá utilizar un método un poco más inteligente. Aquí hay una secuencia de comandos de Python que toma las líneas TSV de stdin y escribe las líneas CSV en stdout:
import sys
import csv
tabin = csv.reader(sys.stdin, dialect=csv.excel_tab)
commaout = csv.writer(sys.stdout, dialect=csv.excel)
for row in tabin:
commaout.writerow(row)
Ejecútelo desde un shell de la siguiente manera:
python script.py < input.tsv > output.csv
Si todo lo que necesita hacer es traducir todos los caracteres de pestañas a caracteres de coma, tr
probablemente sea el camino a seguir.
El espacio en blanco aquí es una pestaña literal:
$ echo "hello world" | tr "//t" ","
hello,world
Por supuesto, si tiene pestañas incrustadas dentro de literales de cadenas en el archivo, esto también las traducirá incorrectamente; pero las pestañas literales incrustadas serían bastante poco comunes.
asumiendo que no quiere cambiar el encabezado y asumiendo que no tiene pestañas incrustadas
# cat file
header header header
one two three
$ awk ''NR>1{$1=$1}1'' OFS="," file
header header header
one,two,three
NR> 1 saltea el primer encabezado. Usted mencionó que sabe cuántas líneas de encabezado, así que use el número correcto para su propio caso. con esto, tampoco necesitas llamar a ningún otro comando externo. solo un comando awk hace el trabajo.
de otra manera si tienes columnas en blanco y te preocupas por eso.
awk ''NR>1{gsub("/t",",")}1'' file
usando sed
sed ''2,$y//t/,/'' file #skip 1 line header and translate (same as tr)
el siguiente awk oneliner admite cotizaciones + cotizaciones-escapes
printf "flop/tflap/"" | awk -F ''/t'' ''{ gsub(/"/,"/"/"/"",$i); for(i = 1; i <= NF; i++) { printf "/"%s/"",$i; if( i < NF ) printf "," }; printf "/n" }''
da
"flop","flap""""
perl -lpe ''s/"/""/g; s/^|$/"/g; s//t/","/g'' < input.tab > output.csv
Perl generalmente es más rápido en este tipo de cosas que sed, awk y Python.
sed -e ''s/"///"/g'' -e ''s/<tab>/","/g'' -e ''s/^/"/'' -e ''s/$/"/'' infile > outfile
Malditos los críticos, citar todo, a CSV no le importa.
<tab>
es el caracter de la pestaña real. no funcionó para mí. En bash, use ^ V para ingresarlo.
Si desea convertir todo el archivo tsv en un archivo csv:
$ cat data.tsv | tr "//t" "," > data.csv
Si quieres omitir algunos campos:
$ cat data.tsv | cut -f1,2,3 | tr "//t" "," > data.csv
El comando anterior convertirá el archivo data.tsv al archivo data.csv que contiene solo los primeros tres campos.