header 的 Kotlin 格式 CSV

Kotlin format CSV with header

我想更改我的 CSV 格式文件通过添加一个 header 以及他的姓名和日期列表

这是我尝试过的,看起来像这样:

fun export(path: File?) {
        CoroutineScope(Dispatchers.IO).launch {
            selected?.let { it ->
                val file = File(path, "${it.name}.csv")
                val tags = repository.getTagsOfList(it.id.toInt())
                val tagsCSV = "TAG: ${tags.map { it.name }}; DATE: ${tags.map { it.date }}"
                file.writeText(
                    "LIST NAME: ${it.name}; " +
                            tagsCSV)
                val csv = file.readText()
                println(csv)
            }
        }
    }

但我想要这种格式:

编辑: 我使用 apache-commons.csv,它更容易,但我有一个例外:

        CoroutineScope(Dispatchers.IO).launch {
            selected?.let { it ->
                val file = "${it.name}.csv"
                val writer = Files.newBufferedWriter(Paths.get(file))
                val csvPrinter =
                    CSVPrinter(writer, CSVFormat.DEFAULT.withHeader("LIST NAME;TAGS;DATE"))
                val tags = repository.getTagsOfList(it.id.toInt())

                // push the values into the file.
                csvPrinter.printRecord(
                    "${it.name};${tags.map { it.name }};${tags.map { it.date }}")

                //pushes the file and its content into the local system
                csvPrinter.flush()
                csvPrinter.close()
                println(csvPrinter)
            }
        }
    }

    FATAL EXCEPTION: DefaultDispatcher-worker-1
        Process: fr.pageup.techcare.readapp.debug, PID: 11435
        java.nio.file.FileSystemException: yuyu.csv: Read-only file system
            at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
            at java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:434)

问题是您没有尝试在每个示例中的相同位置创建文件。

当您自己编写文件时,您将“name.csv”附加到 getExternalFilesDir("lists")

返回的路径

在 apache csv 示例中,您根本不使用 getExternalFilesDir("lists") 的值,您试图写入进程的当前工作目录,该目录与 getExternalFilesDir("lists")

我不是科特林专家,但尝试替换

val file = "${it.name}.csv"
val writer = Files.newBufferedWriter(Paths.get(file))

val file = File(path, "${it.name}.csv")
file.bufferedWriter().use {
   val csvPrinter .... // rest of writing code here
 }

这样,您打开缓冲写入器的位置就会像第一个示例中那样在前面加上 path 的值