2010-11-26 89 views
63

Estoy trabajando en un script largo de Bash. Quiero leer celdas de un archivo CSV en variables Bash. Puedo analizar líneas y la primera columna, pero no cualquier otra columna. Aquí está mi código hasta ahora:Cómo analizar un archivo CSV en Bash?


    cat myfile.csv|while read line 
    do 
    read -d, col1 col2 < <(echo $line) 
    echo "I got:$col1|$col2" 
    done 

Imprime solo la primera columna. Como prueba adicional, He intentado lo siguiente:

read -d, x y < <(echo a,b,)

Y $ y está vacía. Así que he intentado:

read x y < <(echo a b)

Y $ Y es b. ¿Por qué?

+6

¿Ha considerado 'awk' usar' $ 1', '$ 2', etc.? – BeemerGuy

+3

como nota al margen: comando <<(echo "cadena") ---> comando <<< "cadena" – tokland

+0

El programa de línea de comandos 'cortar' fue diseñado para eso: http://ss64.com/bash/cut. html – Jay

Respuesta

125

Es necesario utilizar IFS en lugar de -d:

while IFS=, read -r col1 col2 
do 
    echo "I got:$col1|$col2" 
done < myfile.csv 

Tenga en cuenta que para CSV propósito general de análisis que debe utilizar una herramienta especializada que puede manejar campos indicados con comas interna, entre otras cuestiones que no pueden Bash manejar por sí mismo. Ejemplos de tales herramientas son cvstool y csvkit.

+1

Creo que debería ser 'mientras IFS =, lea col1 col2' – rudivonstaden

+0

@rudivonstaden: Gracias, lo arreglé. –

+2

La solución propuesta está bien para archivos CSV muy simples, es decir, si los encabezados y valores están libres de comas y comillas incrustadas. De hecho, es bastante complicado escribir un analizador de CSV genérico (especialmente porque hay varios "estándares" de CSV). Un enfoque para hacer que los archivos CSV sean más adecuados para las herramientas * nix es convertirlos a TSV (valores separados por tabuladores), p. usando Excel. – peak

6

Desde la página man:

delim -d El primer carácter de delim se utiliza para terminar la línea de entrada, en lugar de salto de línea.

Usted está usando -d, que terminará la línea de entrada en la coma. No leerá el resto de la línea. Es por eso que $ y está vacío.

Cuestiones relacionadas