Skip to content

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.

print(usuarios['nombre'])  # Notación de corchetes
print(usuarios.nombre)      # Notación de punto

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"