跳转到内容

Kotlin CSV文件处理

来自代码酷

Kotlin CSV文件处理[编辑 | 编辑源代码]

CSV(Comma-Separated Values)是一种简单的文件格式,用于存储表格数据(如电子表格或数据库)。Kotlin提供了多种方式来处理CSV文件,包括使用标准库函数或第三方库(如Apache Commons CSV或OpenCSV)。本文将介绍如何使用Kotlin读取、写入和操作CSV文件。

介绍[编辑 | 编辑源代码]

CSV文件由纯文本组成,其中数据以逗号分隔(或其他分隔符,如分号或制表符)。每行代表一条记录,每个字段用分隔符隔开。例如: ```csv Name,Age,City Alice,30,New York Bob,25,London ```

Kotlin处理CSV文件的方式包括: 1. 使用标准库(`java.io`和`kotlin.io`)手动解析。 2. 使用第三方库(如Apache Commons CSV或OpenCSV)简化操作。

使用Kotlin标准库处理CSV[编辑 | 编辑源代码]

Kotlin的标准库提供了基本的文件读写功能,可以用于解析CSV文件。

读取CSV文件[编辑 | 编辑源代码]

以下示例展示如何手动读取CSV文件:

import java.io.File

fun readCSV(filePath: String) {
    File(filePath).forEachLine { line ->
        val fields = line.split(",")
        println("Record: $fields")
    }
}

fun main() {
    readCSV("data.csv")
}

假设`data.csv`内容如下: ```csv Name,Age,City Alice,30,New York Bob,25,London ```

输出: ``` Record: [Name, Age, City] Record: [Alice, 30, New York] Record: [Bob, 25, London] ```

写入CSV文件[编辑 | 编辑源代码]

以下示例展示如何手动写入CSV文件:

import java.io.File

fun writeCSV(filePath: String, data: List<List<String>>) {
    File(filePath).printWriter().use { writer ->
        data.forEach { record ->
            writer.println(record.joinToString(","))
        }
    }
}

fun main() {
    val data = listOf(
        listOf("Name", "Age", "City"),
        listOf("Alice", "30", "New York"),
        listOf("Bob", "25", "London")
    )
    writeCSV("output.csv", data)
}

生成的`output.csv`文件内容与输入相同。

使用第三方库处理CSV[编辑 | 编辑源代码]

对于更复杂的CSV操作(如处理引号、转义字符或大型文件),可以使用第三方库。

Apache Commons CSV[编辑 | 编辑源代码]

Apache Commons CSV是一个流行的库,支持多种CSV格式。

读取CSV[编辑 | 编辑源代码]

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

fun readCSVWithApacheCommons(filePath: String) {
    FileReader(filePath).use { reader ->
        val csvParser = CSVParser(reader, CSVFormat.DEFAULT.withHeader())
        csvParser.forEach { record ->
            println("Name: ${record["Name"]}, Age: ${record["Age"]}, City: ${record["City"]}")
        }
    }
}

fun main() {
    readCSVWithApacheCommons("data.csv")
}

输出: ``` Name: Alice, Age: 30, City: New York Name: Bob, Age: 25, City: London ```

写入CSV[编辑 | 编辑源代码]

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

fun writeCSVWithApacheCommons(filePath: String) {
    FileWriter(filePath).use { writer ->
        CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("Name", "Age", "City")).use { printer ->
            printer.printRecord("Alice", 30, "New York")
            printer.printRecord("Bob", 25, "London")
        }
    }
}

fun main() {
    writeCSVWithApacheCommons("output_apache.csv")
}

OpenCSV[编辑 | 编辑源代码]

OpenCSV是另一个流行的库,适用于Kotlin/Java项目。

读取CSV[编辑 | 编辑源代码]

import com.opencsv.CSVReader
import java.io.FileReader

fun readCSVWithOpenCSV(filePath: String) {
    CSVReader(FileReader(filePath)).use { reader ->
        reader.forEach { fields ->
            println("Record: ${fields.toList()}")
        }
    }
}

fun main() {
    readCSVWithOpenCSV("data.csv")
}

写入CSV[编辑 | 编辑源代码]

import com.opencsv.CSVWriter
import java.io.FileWriter

fun writeCSVWithOpenCSV(filePath: String) {
    CSVWriter(FileWriter(filePath)).use { writer ->
        writer.writeNext(arrayOf("Name", "Age", "City"))
        writer.writeNext(arrayOf("Alice", "30", "New York"))
        writer.writeNext(arrayOf("Bob", "25", "London"))
    }
}

fun main() {
    writeCSVWithOpenCSV("output_opencsv.csv")
}

实际应用案例[编辑 | 编辑源代码]

以下是一个真实场景:从CSV文件加载用户数据并计算平均年龄。

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

fun calculateAverageAge(filePath: String): Double {
    var totalAge = 0.0
    var count = 0

    FileReader(filePath).use { reader ->
        val csvParser = CSVParser(reader, CSVFormat.DEFAULT.withHeader())
        csvParser.forEach { record ->
            val age = record["Age"].toInt()
            totalAge += age
            count++
        }
    }

    return if (count > 0) totalAge / count else 0.0
}

fun main() {
    val averageAge = calculateAverageAge("data.csv")
    println("Average Age: $averageAge")
}

输出: ``` Average Age: 27.5 ```

总结[编辑 | 编辑源代码]

Kotlin提供了多种方式处理CSV文件: 1. **标准库**:适合简单的CSV操作。 2. **第三方库(Apache Commons CSV/OpenCSV)**:适合复杂场景(如带引号的字段或大型文件)。

根据需求选择合适的工具,并确保处理异常(如文件不存在或格式错误)。

参见[编辑 | 编辑源代码]