Working with CSV in Kotlin: Libraries and Code Examples
CSV (Comma-Separated Values) is one of the most popular formats for exchanging tabular data. In Kotlin, as in Java, there are several efficient libraries for working with CSV files. In this article, we will thoroughly examine three main approaches: the native kotlin-csv library, the time-tested OpenCSV, and the powerful Apache Commons CSV. You will learn how to parse, write, and process CSV data with code examples.
1. kotlin-csv Library (Kotlinx.serialization)
kotlin-csv is a modern library written in pure Kotlin. It integrates perfectly with kotlinx.serialization, allowing automatic mapping of CSV rows to data classes. This is the best choice for new Kotlin projects.
Installation
Add the dependency to build.gradle.kts:
dependencies { implementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.9.3") implementation("org.jetbrains.kotlinx:kotlinx-serialization-csv:1.6.3")}CSV Reading Example
import com.github.doyaaaaaken.kotlincsv.dsl.csvReaderimport kotlinx.serialization.Serializableimport kotlinx.serialization.csv.Csv
@Serializabledata class User(val name: String, val age: Int, val email: String)
fun readCsvWithKotlinCsv() { val csvData = """ name,age,email Alice,30,alice@example.com Bob,25,bob@test.org """.trimIndent()
// Option 1: manual parsing val rows: List<List<String>> = csvReader().readAll(csvData) rows.forEach { row -> println("Name: ${row[0]}, Age: ${row[1]}, Email: ${row[2]}") }
// Option 2: with serialization val csv = Csv { ignoreUnknownColumns = true } val users: List<User> = csv.decodeFromString(csvData) users.forEach { println(it) }}CSV Writing Example
import com.github.doyaaaaaken.kotlincsv.dsl.csvWriter
fun writeCsvWithKotlinCsv() { val data = listOf( listOf("Name", "Age", "City"), listOf("John", "28", "New York"), listOf("Jane", "32", "London") ) csvWriter().open("output.csv") { writeRows(data) } println("CSV file successfully written.")}2. OpenCSV Library
OpenCSV is a classic Java library that works great in Kotlin. It provides flexible parsing capabilities, including handling quotes, escaping, and support for different delimiters.
Installation
dependencies { implementation("com.opencsv:opencsv:5.9")}Reading with Mapping to Objects Example
import com.opencsv.CSVReaderBuilderimport com.opencsv.bean.CsvToBeanBuilderimport com.opencsv.bean.HeaderColumnNameMappingStrategyimport java.io.StringReader
data class Product(val id: Int, val name: String, val price: Double)
fun readCsvWithOpenCsv() { val csvContent = """ id,name,price 1,Laptop,999.99 2,Mouse,25.50 """.trimIndent()
// Manual parsing val reader = CSVReaderBuilder(StringReader(csvContent)).build() reader.forEach { line -> println("ID: ${line[0]}, Name: ${line[1]}, Price: ${line[2]}") }
// Mapping to data class val strategy = HeaderColumnNameMappingStrategy<Product>() strategy.type = Product::class.java val beans = CsvToBeanBuilder<Product>(StringReader(csvContent)) .withMappingStrategy(strategy) .build() .parse() beans.forEach { println(it) }}CSV Writing Example
import com.opencsv.CSVWriterimport java.io.StringWriter
fun writeCsvWithOpenCsv() { val stringWriter = StringWriter() val writer = CSVWriter(stringWriter) val