ZetCode

Kotlin CSV

最后修改于 2024 年 1 月 29 日

本文介绍了如何在 Kotlin 中读写 CSV 文件。 我们使用 Opencsv 和 kotlin-csv 库。

CSV(逗号分隔值)格式是电子表格和数据库中使用的非常流行的数据导入和导出格式。

CSV 文件中的每一行都是一条数据记录。 每条记录由一个或多个字段组成,这些字段由逗号分隔。 尽管 CSV 格式是一种非常简单的格式,但可能存在许多差异,例如不同的分隔符、换行符或引用字符。

CSVReader

以下示例从 CSV 文件中读取数字。

src/main/resources/numbers.csv
3,5,6,2,1,7,8
4,5,7,3,2,8,9

我们在 numbers.csv 文件中有两条数据记录。

com/zetcode/read_csv.kt
package com.zetcode

import com.opencsv.CSVReader
import java.io.FileReader
import java.nio.charset.StandardCharsets

fun main() {
    
    val fileName = "src/main/resources/numbers.csv"
    val fr = FileReader(fileName, StandardCharsets.UTF_8)

    fr.use {
        val reader = CSVReader(fr)

        reader.use { r ->

            var line = r.readNext()

            while (line != null) {

                line.forEach {
                    print(" $it")
                }

                println()

                line = r.readNext()
            }
        }
    }
}

该示例从 numbers.csv 文件中读取数字,并将它们打印到控制台。

val fileName = "src/main/resources/numbers.csv"

该文件位于 src/main/resources 目录中。

val reader = CSVReader(fr)

CSVReader 是一个用于读取 CSV 文件的类。

var line = r.readNext()
while (line != null) {

    line.forEach {
        print(" $it")
    }

    println()

    line = r.readNext()
}

我们遍历阅读器并将值打印到终端。 readNext 方法从缓冲区读取下一行并将其转换为字符串数组。

使用不同的分隔符读取 CSV

尽管它的名称是 CSV 文件,但可以使用逗号以外的分隔符来分隔文件。 以下示例演示了如何读取由管道 | 字符分隔的数字。

src/main/resources/numbers.csv
1|2|3|4|5
6|7|3|9|8
9|1|1|0|2

我们有三行数字,用 | 字符分隔。

com/zetcode/read_csv2.kt
package com.zetcode

import com.opencsv.CSVParserBuilder
import com.opencsv.CSVReaderBuilder
import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths


fun main() {

    val fileName = "src/main/resources/numbers.csv"
    val myPath: Path = Paths.get(fileName)

    val parser = CSVParserBuilder().withSeparator('|').build()

    Files.newBufferedReader(myPath, StandardCharsets.UTF_8).use { br ->
        CSVReaderBuilder(br).withCSVParser(parser)
            .build().use { reader ->

                val rows = reader.readAll()

                for (row in rows) {
                    for (e in row) {
                        print("$e ")
                    }

                    println()
                }
            }
    }
}

该示例从 numbers.csv 文件中读取值,并将它们打印到控制台。

val parser = CSVParserBuilder().withSeparator('|').build()

创建了一个带有特定解析器字符的 CSVParser

Files.newBufferedReader(myPath, StandardCharsets.UTF_8).use { br ->
    CSVReaderBuilder(br).withCSVParser(parser)
        .build().use { reader ->

使用 CSVReaderBuilder 创建了 CSVReader

val rows = reader.readAll()

我们使用 readAll 方法一次将所有元素读入一个列表。 这种方法不应用于大型文件。

for (row in rows) {
    for (e in row) {
        print("$e ")
    }

    println()
}

我们遍历数据。

CSVWriter

CSVWriter 类用于将数据写入 CSV 文件。

com/zetcode/write_csv.kt
package com.zetcode

import com.opencsv.CSVWriter
import java.io.FileOutputStream
import java.io.OutputStreamWriter
import java.nio.charset.StandardCharsets

fun main() {

    val entries = arrayOf("book", "coin", "pencil", "cup")
    val fileName = "src/main/resources/items.csv"

    FileOutputStream(fileName).use { fos ->
        OutputStreamWriter(fos, StandardCharsets.UTF_8).use { osw ->
            CSVWriter(osw).use { writer ->
                writer.writeNext(
                    entries
                )
            }
        }
    }
}

该示例将数据从数组写入 items.csv 文件。 该文件被写入项目根目录。 writeNext 方法将一个元素数组写入文件。

使用 kotlin-csv 读/写 CSV

在下一个示例中,我们使用 kotlin-csv 库读取 CSV 数据。

com/zetcode/read_csv3.kt
package com.zetcode

import com.github.doyaaaaaken.kotlincsv.dsl.csvReader

fun main() {

    csvReader().open("src/main/resources/numbers.csv") {

        readAllAsSequence().forEach { row ->

            for (e in row) {
                print("$e ")
            }
            
            println()
        }
    }
}

我们从 numbers.csv 文件中读取数据。

在下一个示例中,我们写入 CSV 数据。

com/zetcode/write_csv2.kt
package com.zetcode

import com.github.doyaaaaaken.kotlincsv.dsl.csvWriter

fun main() {

    val rows = listOf(listOf(1, 2, 3), listOf(4, 5, 6))
    val fileName = "src/main/resources/data.csv"

    csvWriter().open(fileName) {

        rows.forEach { row ->
            writeRow(row)
        }
    }
}

将一个列表列表写入 data.csv 文件。

来源

kotlin-csv Github 页面

在本文中,我们展示了如何在 Kotlin 中使用 CSV。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 Kotlin 教程