
Valores Separados por Comas alias CSV es un dato semiestructurado que usa comas como delimitadores para separar palabras. El formato de archivo CSV es muy popular entre los profesionales de datos porque tienen que lidiar con una gran cantidad de archivos CSV y procesarlos para crear información. En este artículo, nos centraremos en cómo analizar un archivo CSV en un script de shell Bash en Linux.
Para la mayor parte de este artículo, usaré awk
y sed
Herramientas para analizar csv en lugar de combinar diferentes comandos, p. grep
, cut
, tr
etc
Esta awk
Las utilidades reducen la complejidad de canalizar múltiples comandos o escribir bucles con lógica para obtener datos.En cambio, puedes awk
Hacer el trabajo.
1. Prepare el archivo CSV para su procesamiento
Su archivo CSV puede haber sido generado a partir de una base de datos, API, o puede haber ejecutado algunos comandos y convertido la salida a delimitadores con formato CSV. En cualquier caso, debe analizar el conjunto de datos antes de ejecutar la lógica en él.
Como práctica recomendada, debe limpiar su conjunto de datos antes de usarlo. ¿Por qué limpiar el conjunto de datos? En algunos casos, puede haber valores de celdas vacías o encabezados que no están formateados correctamente, procesando columnas adicionales no deseadas, etc.
Estoy usando los siguientes datos CSV de los que obtengo Kagel Con fines demostrativos.
Player_Id,Player_Name,DOB,Batting_Hand,Bowling_Skill,Country 1,SC Ganguly,8-Jul-72,Left_Hand,Right-arm medium, 2,BB McCullum,27-Sep-81,Right_Hand,Right-arm medium, 3,RT Ponting,19-Dec-74,Right_Hand,Right-arm medium, 4,DJ Hussey,15-Jul-77,Right_Hand,Right-arm offbreak,Australia 5,Mohammad Hafeez,17-Oct-80,,Right-arm offbreak,Pakistan 6,R Dravid,11-Jan-73,,Right-arm offbreak,India 7,W Jaffer,16-Feb-78,,Right-arm offbreak,India 8,V Kohli,5-Nov-88,,Right-arm medium,India 9,JH Kallis,16-Oct-75,,Right-arm fast-medium,South Africa 10,CL White,18-Aug-83,Right_Hand,Legbreak googly,Australia 11,MV Boucher,3-Dec-76,Right_Hand,Right-arm medium,South Africa 12,B Akhil,7-Oct-77,Right_Hand,Right-arm medium-fast,India 13,AA Noffke,30-Apr-77,Right_Hand,Right-arm fast-medium,Australia 14,P Kumar,2-Oct-86,Right_Hand,Right-arm medium,India 15,Z Khan,7-Oct-78,Right_Hand,Left-arm fast-medium,India
1.1.reemplazar celdas vacías
En algunos casos, los archivos CSV no tienen valores en celdas específicas. Eche un vistazo a la captura de pantalla a continuación, hay algunas celdas vacías entre las columnas.
Siempre lo reemplazo con «NA» o «Sin valor» para que no haya celdas vacías.Puedes usar lo siguiente awk
El fragmento reemplaza las celdas vacías con el valor deseado. En este caso, reemplazaría las celdas vacías con «sin valor».
awk 'BEGIN{FS=",";OFS=","} { for(i=1;i<=NF;i++) { if($i == ""){ $i="No Value" } } print }' ~/Downloads/Player.csv > player_cleaned.csv
La forma en que funciona este fragmento es que configuro el separador de campo y el separador de campo de salida en coma (FS=",";OFS=","
).utilizar for loop
Itera sobre cada celda en una fila, si se encuentra que una celda está vacía ($i == ""
) y luego reemplazarlo con "No value"
($i="No value"
). Tienes que redirigir los cambios a un nuevo archivo.
1.2 Títulos en mayúsculas
Los archivos CSV pueden o no tener encabezados. Pero si hay un título, siempre lo uso en mayúsculas para una mejor legibilidad.puedes usarlo awk
o sed
Te mostraré dos formas.
awk 'BEGIN{FS=",";OFS=","} { if(NR==1){ print toupper($0) } else { print } }' player.csv > player_cleaned.csv
Aquí estamos comprobando si la línea es la primera usando (NR==1
) y use toupper()
función para capitalizarlo. El mismo fragmento se puede escribir en una sola línea.
awk 'NR==1{ print toupper($0) }NR>1' player.csv > player_cleaned.csv
utilizar awk
, debe redirigir los cambios al nuevo archivo nuevamente. En su lugar, puede utilizar ‘sed
‘ Modificar los cambios directamente en el archivo.aquí \U
Convertir mayúsculas a minúsculas.Si desea conversión a minúsculas, utilice \L
.
$ sed -i -e '1 s/(.*)/\U\1/' player_cleaned.csv
$ cat player_cleaned.csv
1.3 Eliminar las comas finales
Su archivo CSV puede tener una coma al final. Para eliminar las comas finales, puede seguir el siguiente método.
Agregué deliberadamente una coma final a la línea 7 llegar 11 en mi archivo de datos.
Para eliminar todas las comas finales, ejecute el siguiente comando sed
Pedido:
$ sed -i 's/,$//' ~/Documents/player_cleaned.csv
Ahora hemos terminado con la parte de limpieza. Es posible que necesite algunos pasos más, pero depende de la estructura de su archivo CSV y de lo que deba limpiarse.
2. Basta con imprimir el archivo CSV en la terminal
Si está tratando de mostrar un archivo CSV en la terminal, hay varias opciones que le permiten imprimir el archivo en formato tabular, lo que le dará una mejor legibilidad.
2.1.comando de columna
La primera forma es usar column
Pedido. El comando Columna acepta un delimitador establecido en coma y un delimitador para dividir la columna establecida en tabulador en el siguiente comando. También puede establecer su propio separador personalizado.
$ cat player_cleaned.csv | column -s, -t $ column -s, -t player_cleaned.csv
2.2 Comando Buscar CSV
CSVlook es una utilidad que viene con kit csv paquete.No es necesario establecer un separador como lo hacemos nosotros column
Pedido.
$ cat player_cleaned.csv | csvlook
$ csvlook player_cleaned.csv
2.3 Mesas bonitas de Python
si tienes una pitón hermosa El módulo se instala, luego puede ejecutar la siguiente línea y redirigir el archivo CSV para generar la tabla.
python -c "import sys,prettytable; print(prettytable.from_csv(sys.stdin))" < player_cleaned.csv
También puede crear un alias Para una sola línea y pase el nombre del archivo como parámetro.
$ alias ptable="python -c "import sys,prettytable; print(prettytable.from_csv(sys.stdin))""
$ ptable < player_cleaned.csv
3. Obtener datos del archivo CSV
3.1.Imprimir el número de filas y columnas
Para obtener el número de columnas en el archivo CSV, ejecute el siguiente comando.variables aquí NF
Indica el número de campos separados por comas como delimitadores.
$ awk -F, 'END{print NF}' player_cleaned.csv
6
Para obtener el recuento de filas, ejecute el siguiente comando.variables aquí NR
Indica que el registro actual (es decir) cada fila se trata como un registro.
$ awk -F, 'END{print NR}' player_cleaned.csv
16
Para omitir la primera línea (encabezado) y contar el número de líneas, ejecute el siguiente comando.
$ awk -F, 'END{print NR-1}' player_cleaned.csv
15
3.2 Imprimir todo el archivo CSV
Esto es muy simple.puedes usarlo cat
o awk
Imprima todo el archivo CSV.
$ cat player_cleaned.csv
$ awk '{print}' player_cleaned.csv
3.3 Imprimir solo el encabezado del archivo CSV
Imprimir solo los encabezados le dará una buena visión general del tipo de datos que contiene el archivo CSV.puedes usarlo head
o awk
Comando para agarrar títulos individualmente.
$ head -n 1 player_cleaned.csv
$ awk 'NR==1' player_cleaned.csv PLAYER_ID,PLAYER_NAME,DOB,BATTING HAND,BOWLING SKILL,COUNTRY
3.4 Excluyendo la fila de encabezado
Para excluir la fila del encabezado e imprimir todas las demás filas, utilice awk
Pedido. variables awk NR > 1
Se saltará la primera línea.
$ awk '(NR>1)' player_cleansed.csv
sed también se puede usar para excluir la primera línea e imprimir todas las demás líneas.Esta 1d
flag eliminará la primera línea e imprimirá todas las demás líneas en la salida estándar (terminal).
$ sed 1d < player_cleaned.csv
3.5 Impresión de columnas específicas
Podemos usar la posición de la columna para imprimir toda la columna. Hay dos maneras de lograr esto.La primera forma es usar awk El segundo método es utilizar ciclo.awk sería mucho más simple para agarrar la columna.
De forma predeterminada, awk divide la línea según el delimitador y almacena el valor en $1
, $2
, $3
Esperar. El delimitador predeterminado de awk es vacío.
Eche un vistazo al fragmento a continuación, donde el separador de campo (FS=","
) y el separador de campo de salida (OFS=","
) se establece en una coma. La declaración de impresión imprimirá la primera, segunda y sexta columna.
awk 'BEGIN{FS=",";OFS=","} { print $1,$2,$6 }' player_cleansed.csv
También puede escribir el fragmento anterior como una sola línea de código.
awk 'BEGIN{FS=",";OFS=","}{print $1,$2,$6}' player_cleansed.csv
Ahora la segunda forma es usar un bucle.
IFS="," while read -r -a fields do echo ${fields[0]},${fields[1]},${fields[5]} done < player_cleaned.csv
Déjame explicarte qué sucede exactamente cuando ejecutas el fragmento de código anterior.
- Establecemos el separador de campo interno IFS en una coma.
- Usando el comando de lectura, creamos una matriz llamada "campos" y redirigimos el archivo de entrada a
while loop
. - Para cada iteración, leerá fila por fila y almacenará esa fila como un elemento de matriz en un "campo", por lo que puede usar la posición del índice de matriz para obtener una columna específica individualmente.
notas: Los valores del índice comienzan desde 0..N
3.6 Impresión de líneas elegibles
Si desea imprimir líneas que cumplan con ciertos criterios, puede usar awk
Veamos algunos escenarios.
Para imprimir todas las filas que coincidan con los valores de una columna, ejecute el siguiente comando. Aquí estoy tratando de imprimir todas las filas que coinciden con el valor "India" en la columna 6.
$ awk -F , '$6 == "India"' player_cleaned.csv
Para imprimir todas las líneas que no coincidan con un valor, ejecute el siguiente comando.en lugar de un operador de igualdadestamos usando operador no igual.
$ awk -F , '$6 != "India"' player_cleaned.csv
También puede verificar condicionalmente múltiples columnas usando operadores lógicos AND, OR lógicos. Supongamos que quiero verificar todas las filas donde el país es "India" y el bateador es "Right_hand".
aquí, $4
apunta a la columna 4 y $6
Señala la columna 6.símbolo &&
Se utiliza como operador AND lógico para evaluar dos condiciones.
$ awk -F , '$4 == "Right_Hand" && $6 == "India"' player_cleaned.csv
Si desea incluir el encabezado con el resultado de la verificación condicional, use el siguiente comando.Primero imprimo la primera línea usando NR==1
luego use el operador lógico AND para ejecutar una verificación condicional para imprimir el resultado.
$ awk 'NR==1' player_cleaned.csv && awk -F , '$4 == "Right_Hand" && $6 == "India"' player_cleaned.csv
Si desea imprimir o redirigir la salida, ejecute el comando completo en una subcapa usando soportes.
$ (awk 'NR==1' player_cleaned.csv && awk -F , '$4 == "Right_Hand" && $6 == "India"' player_cleaned.csv) | column -t -s,
Una nota sobre Csvkit
Todo lo que hemos visto hasta ahora en este artículo es sencillo. Pero cuando su archivo CSV tiene una estructura compleja, analizarlo con el método anterior se vuelve tedioso.Hay una utilidad llamada CSVKITuna gran utilidad para trabajar con archivos CSV en bash.
El problema con la utilidad csvkit es que está instalada por defecto en su distribución y puede que tenga que instalarla manualmente. Es posible que esto no sea posible en su entorno corporativo, ya que puede haber algunas restricciones en la instalación de paquetes externos. Pero esta utilidad merece una mención, y crearemos un artículo detallado por separado para ella.
En conclusión
En esta guía, vimos cómo usar awk, sed para procesar archivos CSV. También puede usar otras utilidades como cut, grep, tr, etc. para obtener los resultados que desea, pero awk y sed le facilitarán la vida y reducirán la complejidad de escribir una gran cantidad de código. Si tiene algún comentario, menciónelo en la sección de comentarios y nos encantaría saber de usted.