3 - Lectura de CSV en Python y Java

Leer archivos CSV es una tarea fundamental en el procesamiento de datos. A continuación, veremos cómo hacerlo en dos de los lenguajes de programación más populares: Python y Java.

Lectura de CSV en Python

Python ofrece varias formas de leer archivos CSV, siendo las más comunes el módulo csv integrado y la biblioteca pandas, muy utilizada en ciencia de datos.

Usando el módulo csv (Python estándar)

El módulo csv de Python permite leer y escribir archivos CSV de manera sencilla, manejando automáticamente las comillas y los delimitadores.

Ejemplo de archivo datos.csv:

Nombre,Edad,Ciudad
Juan,30,Madrid
Ana,24,"Barcelona, España"
Carlos,35,Valencia

Código Python para leer datos.csv:

import csv

with open('datos.csv', mode='r', encoding='utf-8') as file:
    csv_reader = csv.reader(file)
    header = next(csv_reader) # Lee la primera fila como encabezado
    print(f"Encabezado: {header}")
    for row in csv_reader:
        print(row)

# Para leer como diccionarios (más conveniente)
print("\nLeyendo como diccionarios:")
with open('datos.csv', mode='r', encoding='utf-8') as file:
    csv_reader = csv.DictReader(file)
    for row in csv_reader:
        print(row['Nombre'], row['Edad'], row['Ciudad']) 
        # Acceso por nombre de columna

Explicación:

  • csv.reader: Itera sobre las líneas del archivo CSV y devuelve cada línea como una lista de cadenas.
  • next(csv_reader): Se usa para leer la primera línea, que generalmente contiene los encabezados.
  • csv.DictReader: Es una clase muy útil que lee cada fila como un diccionario, donde las claves son los nombres de las columnas (tomados de la primera fila). Esto facilita el acceso a los datos por nombre.
  • encoding='utf-8': Es crucial especificar la codificación para evitar problemas con caracteres especiales.

Usando pandas (para análisis de datos)

La biblioteca pandas es el estándar de facto en Python para el análisis y manipulación de datos. Proporciona estructuras de datos como DataFrame que son ideales para trabajar con datos tabulares.

Para usar pandas, primero necesitas instalarlo: pip install pandas

Código Python para leer datos.csv con pandas:

import pandas as pd

# Leer el archivo CSV
df = pd.read_csv('datos.csv', encoding='utf-8')

print("DataFrame completo:")
print(df)

print("\nAccediendo a una columna:")
print(df['Nombre'])

print("\nFiltrando datos (ej. personas mayores de 30):")
print(df[df['Edad'] > 30])

Explicación:

  • pd.read_csv(): Es la función principal para leer archivos CSV. Es muy potente y tiene muchos parámetros para manejar delimitadores, encabezados, codificaciones, etc.
  • El resultado es un DataFrame, que es una tabla bidimensional con etiquetas para filas y columnas.
  • Acceder a columnas es sencillo usando df['NombreColumna'].
  • Pandas facilita el filtrado, la selección y la manipulación de datos de manera eficiente.

Lectura de CSV en Java

En Java, puedes leer archivos CSV utilizando clases estándar de I/O o bibliotecas de terceros que ofrecen más funcionalidades.

Usando Scanner (Java estándar)

Para archivos CSV simples, puedes usar la clase Scanner para leer línea por línea y luego dividir cada línea.

Código Java para leer datos.csv con Scanner:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class LeerCsvScanner {
    public static void main(String[] args) {
        String fileName = "datos.csv";
        File file = new File(fileName);

        try (Scanner scanner = new Scanner(file, "UTF-8")) {
            // Leer encabezado
            if (scanner.hasNextLine()) {
                String headerLine = scanner.nextLine();
                String[] headers = headerLine.split(",");
                System.out.println("Encabezado: ");
                for (String h : headers) {
                    System.out.print(h + "\t");
                }
                System.out.println();
            }

            // Leer datos
            while (scanner.hasNextLine()) {
                String dataLine = scanner.nextLine();
                String[] data = dataLine.split(",");
                for (String d : data) {
                    System.out.print(d + "\t");
                }
                System.out.println();
            }

        } catch (FileNotFoundException e) {
            System.err.println("Archivo no encontrado: " + fileName);
        } catch (Exception e) {
            System.err.println("Error al leer el archivo: " + e.getMessage());
        }
    }
}

Explicación:

  • Se crea un Scanner para leer el archivo, especificando la codificación UTF-8.
  • Se lee la primera línea como encabezado y se divide por comas.
  • Luego, se itera sobre las líneas restantes, dividiendo cada una para obtener los campos.
  • Este método es simple pero no maneja automáticamente campos con comas internas o comillas.

Usando OpenCSV (biblioteca de terceros)

Para un manejo más robusto de archivos CSV en Java, especialmente aquellos con campos complejos (comas internas, saltos de línea, comillas), se recomienda usar una biblioteca como OpenCSV.

Primero, necesitas añadir la dependencia a tu proyecto (ej. en Maven):

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.9</version> <!-- Usa la versión más reciente -->
</dependency>

Código Java para leer datos.csv con OpenCSV:

import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvException;

import java.io.FileReader;
import java.io.IOException;
import java.util.List;

public class LeerCsvOpenCsv {
    public static void main(String[] args) {
        String fileName = "datos.csv";

        try (CSVReader reader = new CSVReader(new FileReader(fileName))) {
            List<String[]> allRecords = reader.readAll();

            // Imprimir encabezado
            if (!allRecords.isEmpty()) {
                String[] header = allRecords.get(0);
                System.out.println("Encabezado: ");
                for (String h : header) {
                    System.out.print(h + "\t");
                }
                System.out.println();

                // Imprimir datos
                for (int i = 1; i < allRecords.size(); i++) {
                    String[] record = allRecords.get(i);
                    for (String field : record) {
                        System.out.print(field + "\t");
                    }
                    System.out.println();
                }
            }

        } catch (IOException | CsvException e) {
            System.err.println("Error al leer el archivo CSV: " + e.getMessage());
        }
    }
}

Explicación:

  • CSVReader: Proporciona métodos para leer archivos CSV de forma robusta.
  • readAll(): Lee todo el archivo y devuelve una List de String[], donde cada String[] es una fila.
  • OpenCSV maneja automáticamente las comillas, los delimitadores y los saltos de línea dentro de los campos, lo que lo hace más fiable que Scanner para CSV complejos.