我正在编写一个简单的导入应用程序,需要读取CSV文件,在网格中显示结果,并在另一个网格中显示CSV文件的损坏行。

是否有内置的lib或任何类似pythonic的简单方法?

我在android上做。

最佳答案

[2019年10月编辑] 我写了这个答案几个月后,就可以在Koyama Kenta wrote a Kotlin targeted library上找到https://github.com/doyaaaaaken/kotlin-csv,它对我来说比opencsv好得多。

用法示例:(有关更多信息,请参见提到的github页面)

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

fun main() {
    csvReader().open("src/main/resources/test.csv") {
        readAllAsSequence().forEach { row ->
            //Do something
            println(row) //[a, b, c]
        }
    }
}

有关此示例的完整的最小项目,请参阅https://github.com/PHPirates/kotlin-csv-reader-example

使用opencsv的旧答案:

如建议的那样,使用opencsv很方便。这是一个最小的示例:
// You can of course remove the .withCSVParser part if you use the default separator instead of ;
val csvReader = CSVReaderBuilder(FileReader("filename.csv"))
        .withCSVParser(CSVParserBuilder().withSeparator(';').build())
        .build()

// Maybe do something with the header if there is one
val header = csvReader.readNext()

// Read the rest
var line: Array<String>? = csvReader.readNext()
while (line != null) {
    // Do something with the data
    println(line[0])

    line = csvReader.readNext()
}

docs所示,当您不需要分别处理每一行时,可以以Map的形式获得结果:
import com.opencsv.CSVReaderHeaderAware
import java.io.FileReader

fun main() {
    val reader = CSVReaderHeaderAware(FileReader("test.csv"))
    val resultList = mutableListOf<Map<String, String>>()
    var line = reader.readMap()
    while (line != null) {
        resultList.add(line)
        line = reader.readMap()
    }
    println(resultList)
    // Line 2, by column name
    println(resultList[1]["my column name"])
}

Gradle的依赖关系:compile 'com.opencsv:opencsv:4.6'或Gradle Kotlin DSL的依赖关系:compile("com.opencsv:opencsv:4.6")(一如既往,请检查docs中的最新版本)。

10-08 12:36