Kotlin Android中将HashMap转换为CSV时数据格式异常如何修复
问题修复方案
你遇到的格式异常问题可以通过以下修改解决:
核心问题原因
- 未遵循CSV规范对特殊字段做转义处理:当单元格内容包含逗号、换行符、双引号时,直接拼接会导致列错位、格式错乱
- 泛型缺失导致元素输出异常:你定义的
MutableMap<String, MutableList>没有指定列表内元素类型,如果元素本身是集合类型,直接调用toString会自动带上[]方括号 - 未处理非字符串类型元素的格式化输出
修复后代码
binding.btnSave.setOnClickListener() { Sdata = viewModel.savehash val csv = File(this.filesDir, "test.csv") val valuesSeparator = "," val lineTerminator = "\r\n" // CSV字段转义函数,符合通用CSV规范 fun escapeCsvField(value: Any?): String { val str = value?.toString() ?: "" // 包含特殊字符的字段用双引号包裹,内部双引号替换为两个双引号完成转义 return if (str.contains(Regex("[,\"]|\\r|\\n"))) { "\"${str.replace("\"", "\"\"")}\"" } else { str } } // 写入表头,新增转义处理 csv.writeText( Sdata.keys.joinToString( separator = valuesSeparator, postfix = lineTerminator, transform = ::escapeCsvField ) ) // 写入数据行 val nRows = Sdata.values.maxOf { it.size } for (i in 0 until nRows) { val row = Sdata.values .map { list -> val element = list.getOrElse(i) { "" } // 如果列表元素本身是集合,可取消下行注释调整为你需要的分隔格式,示例为分号分隔 // if (element is List<*>) element.joinToString(";") else escapeCsvField(element) } .joinToString(separator = valuesSeparator, postfix = lineTerminator) csv.appendText(row) } Log.d(TAG, "CSV VIEW: $Sdata") Toast.makeText(this, "Data Saved to Documents", Toast.LENGTH_SHORT).show() }
额外注意事项
如果确认所有列表长度完全一致,可以换回注释中的nRows = Sdata.values.first().size和map { it[i] }写法,提升运行效率。
内容的提问来源于stack exchange,提问作者Sammy Park
相关产品推荐
相关产品推荐

