CSV
CSV (Comma Separated Values) es un formato utilizado para almacenar tablas de datos en texto plano:
id,titulo,autor
1,El color de la magia,Terry Pratchett
2,El temor de un hombre sabio,Patrick Rothfuss
3,Exhalación,Ted Chiang
La primera línea contiene los nombres de las columnas, y cada línea subsiguiente representa una fila de datos. Los valores están separados por comas.
Es un formato muy usado para exportar e importar datos entre aplicaciones, especialmente en hojas de cálculo y bases de datos, pero lo encontrarás en muchos otros contextos como inteligencia artificial, análisis de datos y más.
CSVKit
CSVKit es una colección de herramientas de línea de comandos para trabajar con archivos CSV. Permite realizar diversas operaciones como la conversión, filtrado, ordenación y análisis de datos en archivos CSV.
csvlook
Muestra el contenido de un archivo CSV en formato tabular.
datadiego@/tmp csvlook libros.csv
| id | titulo | autor |
| --- | --------------------------- | ---------------- |
| 1 | El color de la magia | Terry Pratchett |
| 2 | El temor de un hombre sabio | Patrick Rothfuss |
| 3 | Exhalación | Ted Chiang |
csvcut
Extrae columnas específicas de un archivo CSV.
datadiego@/tmp csvcut -c titulo,autor libros.csv
titulo,autor
El color de la magia,Terry Pratchett
El temor de un hombre sabio,Patrick Rothfuss
Exhalación,Ted Chiang
csvgrep
Filtra filas de un archivo CSV basándose en un patrón específico.
datadiego@/tmp csvgrep -c autor -m "Terry Pratchett" libros.csv
id,titulo,autor
1,El color de la magia,Terry Pratchett
csvsort
Ordena un archivo CSV por una o más columnas.
datadiego@/tmp csvsort -c titulo libros.csv
id,titulo,autor
1,El color de la magia,Terry Pratchett
2,El temor de un hombre sabio,Patrick Rothfuss
3,Exhalación,Ted Chiang
datadiego@/tmp csvsort -c autor libros.csv
id,titulo,autor
2,El temor de un hombre sabio,Patrick Rothfuss
3,Exhalación,Ted Chiang
1,El color de la magia,Terry Pratchett
csvstat
Muestra estadísticas sobre un archivo CSV, como el número de filas, columnas y tipos de datos.
1. "id"
Type of data: Number
Contains null values: False
Non-null values: 3
Unique values: 3
Smallest value: 0,
Largest value: 2,
Sum: 3,
Mean: 1,
Median: 1,
StDev: 1,
Most decimal places: 0
Most common values: 0, (1x)
1, (1x)
2, (1x)
2. "nombre"
Type of data: Text
Contains null values: False
Non-null values: 3
Unique values: 3
Longest value: 5, characters
Most common values: admin (1x)
user0 (1x)
user1 (1x)
3. "pass"
Type of data: Text
Contains null values: False
Non-null values: 3
Unique values: 3
Longest value: 9, characters
Most common values: adminpass (1x)
user0pass (1x)
user1pass (1x)
4. "saldo"
Type of data: Number
Contains null values: False
Non-null values: 3
Unique values: 3
Smallest value: 2.000,
Largest value: 99.999,
Sum: 113.999,
Mean: 37.999,667
Median: 12.000,
StDev: 53.925,3
Most decimal places: 0
Most common values: 99.999, (1x)
12.000, (1x)
2.000, (1x)
Row count: 3
Muy util para obtener una visión general rápida de los datos en un archivo CSV.
csvsql
Convierte un archivo CSV a una base de datos SQL.
datadiego@~/codebase/databases/csv csvsql usuarios -i mysql
CREATE TABLE usuarios (
id DECIMAL(38, 0) NOT NULL,
nombre VARCHAR(5) NOT NULL,
pass VARCHAR(9) NOT NULL,
saldo DECIMAL(38, 0) NOT NULL
);
datadiego@~/codebase/databases/csv csvsql usuarios -i sqlite
CREATE TABLE usuarios (
id FLOAT NOT NULL,
nombre VARCHAR NOT NULL,
pass VARCHAR NOT NULL,
saldo FLOAT NOT NULL
);
No le tengas demasiada fe a csvsql en cuanto al tipado de datos, pero puede darte una idea de cómo se vería la tabla en una base de datos SQL.
csvjson
Convierte de CSV a JSON.
datadiego@~/codebase/databases/csv csvjson usuarios
[{"id": 0.0, "nombre": "admin", "pass": "adminpass", "saldo": 99999.0}, {"id": 1.0, "nombre": "user0", "pass": "user0pass", "saldo": 12000.0}, {"id": 2.0, "nombre": "user1", "pass": "user1pass", "saldo": 2000.0}]
datadiego@~/codebase/databases/csv csvjson -i 1 usuarios
[
{
"id": 0.0,
"nombre": "admin",
"pass": "adminpass",
"saldo": 99999.0
},
{
"id": 1.0,
"nombre": "user0",
"pass": "user0pass",
"saldo": 12000.0
},
{
"id": 2.0,
"nombre": "user1",
"pass": "user1pass",
"saldo": 2000.0
}
]
csvpy
Convierte un archivo CSV a un agate.csv.reader, que es un objeto de Python que permite manipular los datos de manera más eficiente:
datadiego@~/codebase/databases/csv csvpy usuarios
Welcome! "usuarios" has been loaded in an agate.csv.reader object named "reader".
>>> for row in reader:
... print(row);
...
['id', 'nombre', 'pass', 'saldo']
['0', 'admin', 'adminpass', '99999']
['1', 'user0', 'user0pass', '12000']
['2', 'user1', 'user1pass', '2000']
Pandas
Pandas es una biblioteca de Python que proporciona estructuras de datos y herramientas de análisis de datos. Es especialmente útil para trabajar con datos tabulares, como los que se encuentran en archivos CSV.
Para trabajar con archivos CSV en Pandas, puedes usar la función read_csv
para leer el archivo y convertirlo en un DataFrame, que es una estructura de datos bidimensional similar a una tabla.
import pandas as pd
usuarios = pd.read_csv('usuarios.csv')
print(usuarios)
print("--------------")
usuario_1 = usuarios[usuarios['id'] == 1]
print(usuario_1)
print("--------------")
usuarios_mayores_180 = usuarios[usuarios['saldo'] > 180]
print(usuarios_mayores_180)
print("--------------")
print(usuarios.columns)
print(usuarios.head())
Acceder a los datos en un DataFrame es similar a trabajar con un diccionario, pero con la ventaja de que puedes usar tanto la notación de corchetes como la notación de punto para acceder a las columnas.
Ademas de filtrar y seleccionar datos condicionalmente, Pandas permite realizar operaciones de agregación, ordenación...
usuarios_ordenados = usuarios.sort_values(by='saldo', ascending=False)
print(usuarios_ordenados)
media_saldo = usuarios['saldo'].mean()
print(f"La media de saldo es: {media_saldo}")
pandas
es una herramienta muy poderosa para analisis de datos, big data y machine learning, es ampliamente utilizada en la comunidad de ciencia de datos, asi que dependiendo de tu proyecto, puede que necesites saberla.
Ya hemos visto que al final, muchos datos se almacenan separandolos por algun caracter especial, vamos a crear un script que nos permita leer cualquier fichero plano, pasarle un delimitador y extraer los campos que nos interesen.
#!/bin/bash
# Script para leer un fichero plano y extraer campos específicos
if [ "$#" -ne 3 ]; then
echo "Uso: $0 <fichero> <delimitador> <campo1,campo2,...>"
exit 1
fi
fichero="$1"
delimitador="$2"
campos="$3"
IFS="$delimitador" # Establece el delimitador
while read -r linea; do
IFS="$delimitador" read -ra valores <<< "$linea" # Divide la línea en campos
for campo in ${campos//,/ }; do
echo -n "${valores[$campo]}$delimitador" # Imprime el campo solicitado
done
echo # Nueva línea al final de cada registro
done < "$fichero"