Работа с 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("Запись завершена")
}