You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Android中将HashMap转换为CSV时数据格式异常如何修复

问题修复方案

你遇到的格式异常问题可以通过以下修改解决:

核心问题原因

  1. 未遵循CSV规范对特殊字段做转义处理:当单元格内容包含逗号、换行符、双引号时,直接拼接会导致列错位、格式错乱
  2. 泛型缺失导致元素输出异常:你定义的MutableMap<String, MutableList>没有指定列表内元素类型,如果元素本身是集合类型,直接调用toString会自动带上[]方括号
  3. 未处理非字符串类型元素的格式化输出

修复后代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:15:04