Trabalhando com CSV em Kotlin: bibliotecas e exemplos práticos
O formato CSV (Comma-Separated Values) continua sendo uma das formas mais populares de trocar dados tabulares. Na linguagem Kotlin, que é ativamente usada para desenvolvimento Android, backend (Ktor, Spring Boot) e scripts, existem várias bibliotecas convenientes para trabalhar com CSV. Neste artigo, vamos analisar três abordagens principais: a biblioteca leve kotlin-csv, o poderoso OpenCSV e o clássico Apache Commons CSV.
1. Biblioteca kotlin-csv (recomendada)
Esta é uma solução puramente Kotlin que não requer dependências adicionais do Java. É ideal para projetos onde a concisão e a segurança de tipos são importantes.
Instalação (Gradle)
// build.gradle.ktsimplementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.9.3")Leitura de CSV
A biblioteca suporta detecção automática de delimitador, escape de aspas e cabeçalhos.
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]}") }}
// Leitura com cabeçalhosfun readWithHeaders() { val data = csvReader().readAllWithHeader(csvData) data.forEach { row -> println("${row["name"]} is ${row["age"]} years old") }}Escrita 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) // Saída no console: // Product,Price,Quantity // Laptop,1200,5 // Mouse,25,50}2. OpenCSV (para cenários complexos)
OpenCSV é uma biblioteca Java madura que funciona muito bem em Kotlin. Ela suporta mapeamento para data-classes, delimitadores personalizados e processamento em fluxo de arquivos grandes.
Instalação
implementation("com.opencsv:opencsv:5.9")Leitura com mapeamento para 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)}Escrita com cabeçalhos
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 compatibilidade)
Esta biblioteca é o padrão de facto para Java. Ela fornece controle de baixo nível sobre o parsing e suporta vários formatos (Excel, MySQL, TSV).