Работа с CSV в Kotlin: библиотеки, парсинг и запись данных

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с CSV в Kotlin: обзор библиотек и практические примеры

CSV (Comma-Separated Values) — один из самых распространённых форматов для обмена табличными данными. В Kotlin, как и в Java, существует несколько зрелых библиотек для работы с CSV. В этой статье мы рассмотрим три основных подхода: лёгкую библиотеку kotlin-csv, мощный OpenCSV и классический Apache Commons CSV. Вы узнаете, как читать, писать и обрабатывать CSV-файлы с минимальными усилиями.

1. Библиотека kotlin-csv (рекомендуемый вариант)

kotlin-csv — это нативная Kotlin-библиотека, написанная полностью на Kotlin без зависимостей от Java-библиотек. Она идеально подходит для современных проектов на Kotlin.

Подключение (Gradle)

dependencies {
    implementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.9.3")
}

Чтение CSV

import com.github.doyaaaaaken.kotlincsv.dsl.csvReader

fun main() {
    val csvData = """
        name,age,city
        Alice,30,New York
        Bob,25,London
        Charlie,35,Tokyo
    """.trimIndent()

    val rows: List<List<String>> = csvReader().readAll(csvData)
    rows.forEach { row ->
        println("${row[0]} — ${row[1]} лет, ${row[2]}")
    }
}

Запись CSV

import com.github.doyaaaaaken.kotlincsv.dsl.csvWriter

fun main() {
    val data = listOf(
        listOf("product", "price", "quantity"),
        listOf("Laptop", "1200", "5"),
        listOf("Mouse", "25", "50")
    )
    csvWriter().open("inventory.csv") {
        writeRows(data)
    }
    println("Файл inventory.csv создан")
}

2. OpenCSV — проверенная Java-библиотека

OpenCSV — одна из самых популярных Java-библиотек для работы с CSV. Она отлично работает в Kotlin благодаря полной совместимости.

Подключение (Gradle)

dependencies {
    implementation("com.opencsv:opencsv:5.9")
}

Чтение с маппингом в класс

import com.opencsv.bean.CsvToBeanBuilder
import java.io.FileReader

data class Person(
    @field:com.opencsv.bean.CsvBindByName(column = "name")
    val name: String,
    @field:com.opencsv.bean.CsvBindByName(column = "age")
    val age: Int,
    @field:com.opencsv.bean.CsvBindByName(column = "city")
    val city: String
)

fun main() {
    val beans = CsvToBeanBuilder<Person>(FileReader("people.csv"))
        .withType(Person::class.java)
        .build()
        .parse()

    beans.forEach { println("${it.name} (${it.age}) — ${it.city}") }
}

Запись объектов

import com.opencsv.bean.StatefulBeanToCsv
import com.opencsv.bean.StatefulBeanToCsvBuilder
import java.io.FileWriter

fun main() {
    val people = listOf(
        Person("Alice", 30, "New York"),
        Person("Bob", 25, "London")
    )
    val writer = FileWriter("output.csv")
    val beanToCsv: StatefulBeanToCsv<Person> = StatefulBeanToCsvBuilder(writer).build()
    beanToCsv.write(people)
    writer.close()
    println("Готово")
}

3. Apache Commons CSV — промышленный стандарт

Библиотека от Apache Foundation, поддерживающая различные форматы CSV (Excel, MySQL, RFC 4180).

Подключение (Gradle)

dependencies {
    implementation("org.apache.commons:commons-csv:1.11.0")
}

Чтение с заголовками

import org.apache.commons.csv.CSVFormat
import org.apache.commons.csv.CSVParser
import java.io.FileReader

fun main() {
    val parser = CSVParser.parse(
        FileReader("data.csv"),
        CSVFormat.DEFAULT.withFirstRecordAsHeader()
    )
    parser.forEach { record ->
        val name = record["name"]
        val age = record["age"]
        println("$name, возраст $age")
    }
}

Запись с кастомным форматом

import org.apache.commons.csv.CSVFormat
import org.apache.commons.csv.CSVPrinter
import java.io.FileWriter

fun main() {
    val printer = CSVPrinter(
        FileWriter("output.csv"),
        CSVFormat.DEFAULT.withHeader("id", "title", "price")
    )
    printer.printRecord(1, "Kotlin Handbook", 29.99)
    printer.printRecord(2, "CSV Guide", 15.50)
    printer.close()
    println("Запись завершена")
}

Сравнение

Рекомендаций