Los archivos CSV, a pesar de su simplicidad, pueden presentar desafíos cuando los datos contienen caracteres especiales como comas, saltos de línea o comillas. Entender cómo manejar estos casos es crucial para evitar errores de parseo.
Cuando un campo de datos contiene el carácter delimitador (por ejemplo, una coma en un archivo CSV delimitado por comas) o comillas dobles, el estándar CSV indica que todo el campo debe encerrarse entre comillas dobles. Si el campo ya contiene comillas dobles, estas deben ser "escapadas" duplicándolas.
Ejemplo:
Producto,Descripción,Precio
"Manzana","Una fruta roja, dulce y crujiente",1.50
"Libro","""El Quijote"", una obra maestra",20.00
Naranja,Fruta cítrica,1.20
"""El Quijote"""
) y todo el campo se encierra entre comillas dobles.La mayoría de las bibliotecas de parseo de CSV manejan esto automáticamente, pero es importante ser consciente de esta convención.
Un campo CSV también puede contener saltos de línea. Para que el parser no interprete el salto de línea como el final de una fila, el campo completo debe estar encerrado entre comillas dobles.
Ejemplo:
ID,Comentario
1,"Este es un comentario
con múltiples líneas."
2,Comentario de una sola línea.
Aquí, el comentario para el ID 1 se extiende a lo largo de dos líneas en el archivo CSV, pero se considera un único campo debido a las comillas dobles que lo encierran.
Los datos nulos o vacíos en CSV se representan generalmente de dos maneras:
valor1,,valor3
indica que el segundo campo está vacío.
NULL
, NA
, N/A
o -
para representar valores nulos. Es importante conocer la convención utilizada en el archivo para interpretarlos correctamente.
Ejemplo:
Nombre,Edad,Email
Juan,30,juan@example.com
Ana,,ana@example.com
Carlos,40,
En este ejemplo, Ana tiene un campo de edad vacío, y Carlos tiene un campo de email vacío.
Como se mencionó en la introducción, la codificación de caracteres es fundamental. Si un archivo CSV se lee con la codificación incorrecta, los caracteres especiales (acentos, eñes, símbolos) aparecerán como símbolos extraños o ilegibles (mojibake).
chardet
puede ser útil:
import chardet
with open('archivo.csv', 'rb') as rawdata:
result = chardet.detect(rawdata.read(10000)) # Lee los primeros 10KB
print(result) # {'encoding': 'UTF-8', 'confidence': 0.99, 'language': ''}
Siempre que sea posible, se debe estandarizar el uso de UTF-8 para evitar estos problemas.