Работа с CSV в Kotlin: библиотеки и примеры кода
CSV (Comma-Separated Values) — один из самых популярных форматов для обмена табличными данными. В Kotlin, как и в Java, существует несколько эффективных библиотек для работы с CSV-файлами. В этой статье мы подробно разберём три основных подхода: нативную библиотеку kotlin-csv, проверенный временем OpenCSV и мощный Apache Commons CSV. Вы узнаете, как парсить, записывать и обрабатывать CSV-данные с примерами кода.
1. Библиотека kotlin-csv (Kotlinx.serialization)
kotlin-csv — это современная библиотека, написанная на чистом Kotlin. Она идеально интегрируется с kotlinx.serialization, что позволяет автоматически маппить CSV-строки в data-классы. Это лучший выбор для новых проектов на Kotlin.
Установка
Добавьте зависимость в 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
import com.github.doyaaaaaken.kotlincsv.dsl.csvReader
import kotlinx.serialization.Serializable
import kotlinx.serialization.csv.Csv
@Serializable
data 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()
// Вариант 1: ручной парсинг
val rows: List<List<String>> = csvReader().readAll(csvData)
rows.forEach { row ->
println("Name: ${row[0]}, Age: ${row[1]}, Email: ${row[2]}")
}
// Вариант 2: с сериализацией
val csv = Csv { ignoreUnknownColumns = true }
val users: List<User> = csv.decodeFromString(csvData)
users.forEach { println(it) }
}
Пример записи CSV
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 файл успешно записан.")
}
2. Библиотека OpenCSV
OpenCSV — классическая Java-библиотека, которая отлично работает в Kotlin. Она предоставляет гибкие возможности для парсинга, включая обработку кавычек, экранирование и поддержку разных разделителей.
Установка
dependencies {
implementation("com.opencsv:opencsv:5.9")
}
Пример чтения с маппингом в объекты
import com.opencsv.CSVReaderBuilder
import com.opencsv.bean.CsvToBeanBuilder
import com.opencsv.bean.HeaderColumnNameMappingStrategy
import 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()
// Ручной парсинг
val reader = CSVReaderBuilder(StringReader(csvContent)).build()
reader.forEach { line ->
println("ID: ${line[0]}, Name: ${line[1]}, Price: ${line[2]}")
}
// Маппинг в data-класс
val strategy = HeaderColumnNameMappingStrategy<Product>()
strategy.type = Product::class.java
val beans = CsvToBeanBuilder<Product>(StringReader(csvContent))
.withMappingStrategy(strategy)
.build()
.parse()
beans.forEach { println(it) }
}
Пример записи CSV
import com.opencsv.CSVWriter
import java.io.StringWriter
fun writeCsvWithOpenCsv() {
val stringWriter = StringWriter()
val writer = CSVWriter(stringWriter)
val entries = arrayOf(
arrayOf("Country", "Capital", "Population"),
arrayOf("Russia", "Moscow", "144.5M"),
arrayOf("Japan", "Tokyo", "125.7M")
)
writer.writeAll(entries.toList())
writer.close()
println(stringWriter.toString())
}
3. Apache Commons CSV
Apache Commons CSV — ещё одна мощная библиотека от Apache. Она предоставляет богатый API для работы с CSV, TSV и другими форматами, поддерживает пользовательские разделители и эк