Kotlin CSV
最后修改于 2024 年 1 月 29 日
本文介绍了如何在 Kotlin 中读写 CSV 文件。 我们使用 Opencsv 和 kotlin-csv 库。
CSV(逗号分隔值)格式是电子表格和数据库中使用的非常流行的数据导入和导出格式。
CSV 文件中的每一行都是一条数据记录。 每条记录由一个或多个字段组成,这些字段由逗号分隔。 尽管 CSV 格式是一种非常简单的格式,但可能存在许多差异,例如不同的分隔符、换行符或引用字符。
CSVReader
以下示例从 CSV 文件中读取数字。
3,5,6,2,1,7,8 4,5,7,3,2,8,9
我们在 numbers.csv 文件中有两条数据记录。
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 文件,但可以使用逗号以外的分隔符来分隔文件。 以下示例演示了如何读取由管道 | 字符分隔的数字。
1|2|3|4|5 6|7|3|9|8 9|1|1|0|2
我们有三行数字,用 | 字符分隔。
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 文件。
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 数据。
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 数据。
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。
作者
列出 所有 Kotlin 教程。