Trabajo con CSV en Kotlin: bibliotecas y ejemplos prácticos
El formato CSV (Comma-Separated Values) sigue siendo una de las formas más populares de intercambiar datos tabulares. En el lenguaje Kotlin, que se utiliza activamente para el desarrollo de Android, backend (Ktor, Spring Boot) y scripts, existen varias bibliotecas convenientes para trabajar con CSV. En este artículo, analizaremos tres enfoques principales: la biblioteca ligera kotlin-csv, el potente OpenCSV y el clásico Apache Commons CSV.
1. Biblioteca kotlin-csv (recomendada)
Esta es una solución puramente Kotlin que no requiere dependencias adicionales de Java. Es ideal para proyectos donde la concisión y la seguridad de tipos son importantes.
Instalación (Gradle)
// build.gradle.ktsimplementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.9.3")Lectura de CSV
La biblioteca admite la detección automática del delimitador, escape de comillas y encabezados.
import com.github.doyaaaaaken.kotlincsv.dsl.csvReader
fun readCsvExample() { val csvData = """ name,age,city Alice,30,New York Bob,25,London """.trimIndent()
val rows: List<List<String>> = csvReader().readAll(csvData)
rows.forEach { row -> println("Name: ${row[0]}, Age: ${row[1]}, City: ${row[2]}") }}
// Lectura con encabezadosfun readWithHeaders() { val data = csvReader().readAllWithHeader(csvData) data.forEach { row -> println("${row["name"]} is ${row["age"]} years old") }}Escritura de CSV
import com.github.doyaaaaaken.kotlincsv.dsl.csvWriter
fun writeCsvExample() { val rows = listOf( listOf("Product", "Price", "Quantity"), listOf("Laptop", "1200", "5"), listOf("Mouse", "25", "50") )
csvWriter().writeAll(rows) // Salida en consola: // Product,Price,Quantity // Laptop,1200,5 // Mouse,25,50}2. OpenCSV (para escenarios complejos)
OpenCSV es una biblioteca Java madura que funciona muy bien en Kotlin. Admite mapeo a data-classes, delimitadores personalizados y procesamiento en flujo de archivos grandes.
Instalación
implementation("com.opencsv:opencsv:5.9")Lectura con mapeo a data-class
import com.opencsv.bean.CsvToBeanBuilderimport java.io.StringReader
data class Person( @CsvBindByName(column = "name") val name: String, @CsvBindByName(column = "age") val age: Int, @CsvBindByName(column = "city") val city: String)
fun readWithOpenCsv() { val csv = """ name,age,city Alice,30,New York Bob,25,London """.trimIndent()
val beans: List<Person> = CsvToBeanBuilder<Person>(StringReader(csv)) .withType(Person::class.java) .build() .parse()
beans.forEach { println(it) } // Person(name=Alice, age=30, city=New York) // Person(name=Bob, age=25, city=London)}Escritura con encabezados
import com.opencsv.bean.StatefulBeanToCsvimport com.opencsv.bean.StatefulBeanToCsvBuilderimport java.io.StringWriter
fun writeWithOpenCsv() { val people = listOf( Person("Charlie", 35, "Paris"), Person("Diana", 28, "Tokyo") )
val writer = StringWriter() val beanToCsv: StatefulBeanToCsv<Person> = StatefulBeanToCsvBuilder<Person>(writer) .build() beanToCsv.write(people)
println(writer.toString()) // name,age,city // Charlie,35,Paris // Diana,28,Tokyo}3. Apache Commons CSV (para compatibilidad)
Esta biblioteca es el estándar de facto para Java. Proporciona control de bajo nivel sobre el análisis y admite varios formatos (Excel, MySQL, TSV).
Insta
También en la biblioteca
Serialización de objetos en Swift: Codable, NSCoding y JSONEncoder
Gorilla Mux para Go: guía completa con ejemplos
Análisis de HTML en Java: mejores bibliotecas y ejemplos de código