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
的值
我想更改我的 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
的值