在 Kotlin 中处理 CSV:库与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Kotlin 中处理 CSV:库与代码示例



CSV(逗号分隔值)是最流行的表格数据交换格式之一。在 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.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()

// 方式 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.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()

// 手动解析 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.CSVWriterimport java.io.StringWriter

fun writeCsvWithOpenCsv() { val stringWriter = StringWriter() val writer = CSVWriter(stringWriter) val

推荐