Arbeiten mit CSV in Kotlin: Bibliotheken und praktische Beispiele
Das CSV-Format (Comma-Separated Values) bleibt eine der beliebtesten Methoden zum Austausch von Tabellendaten. In der Sprache Kotlin, die aktiv für die Android-Entwicklung, Backend (Ktor, Spring Boot) und Skripte verwendet wird, gibt es mehrere praktische Bibliotheken für die Arbeit mit CSV. In diesem Artikel betrachten wir drei Hauptansätze: die leichte Bibliothek kotlin-csv, das leistungsstarke OpenCSV und das klassische Apache Commons CSV.
1. Bibliothek kotlin-csv (empfohlen)
Dies ist eine reine Kotlin-Lösung, die keine zusätzlichen Java-Abhängigkeiten erfordert. Sie ist ideal für Projekte, bei denen Prägnanz und Typsicherheit wichtig sind.
Installation (Gradle)
// build.gradle.ktsimplementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.9.3")CSV lesen
Die Bibliothek unterstützt die automatische Erkennung von Trennzeichen, Escape-Anführungszeichen und Kopfzeilen.
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]}") }}
// Lesen mit Kopfzeilenfun readWithHeaders() { val data = csvReader().readAllWithHeader(csvData) data.forEach { row -> println("${row["name"]} ist ${row["age"]} Jahre alt") }}CSV schreiben
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) // Ausgabe in der Konsole: // Product,Price,Quantity // Laptop,1200,5 // Mouse,25,50}2. OpenCSV (für komplexe Szenarien)
OpenCSV ist eine ausgereifte Java-Bibliothek, die in Kotlin hervorragend funktioniert. Sie unterstützt Mapping auf data-Klassen, benutzerdefinierte Trennzeichen und die Stream-Verarbeitung großer Dateien.
Installation
implementation("com.opencsv:opencsv:5.9")Lesen mit Mapping auf data-Klasse
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)}Schreiben mit Kopfzeilen
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 (für Kompatibilität)
Diese Bibliothek ist der De-facto-Standard für Java. Sie bietet eine niedrigschwellige Kontrolle über das Parsen und unterstützt verschiedene Formate (Excel, MySQL, TSV).
Installation
implementation("org.apache.commons:commons-csv:1.11.0")CSV lesen mit manueller Iteration
import org.apache.commons.csv.CSVFormatimport org.apache.commons.csv.CSVParserimport java.io.StringReader
fun readWithApacheCsv() { val csv = """ name,age,city Alice,30,New York Bob,25,London """.trimIndent()
val parser = CSVParser(StringReader(csv), CSVFormat.DEFAULT.withFirstRecordAsHeader())
parser.forEach { record -> println("${record.get("name")} wohnt in ${record.get("city")}") }}CSV schreiben
import org.apache.commons.csv.CSVFormatimport org.apache.commons.csv.CSVPrinterimport java.io.StringWriter
fun writeWithApacheCsv() { val writer = StringWriter() val printer = CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("Name", "Alter", "Stadt"))
printer.printRecord("Eve", 22, "Berlin") printer.printRecord("Frank", 40, "Rom") printer.close()
println(writer.toString()) // Name,Alter,Stadt // Eve,22,Berlin // Frank,40,Rom}Fazit
Jede der vorgestellten Bibliotheken hat ihre Stärken. kotlin-csv eignet sich am besten für reine Kotlin-Projekte, OpenCSV für komplexe Daten-Mapping-Aufgaben und Apache Commons CSV für maximale Kompatibilität mit Java-Ökosystemen. Wählen Sie die Bibliothek, die am besten zu Ihren Projektanforderungen passt.