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

Kotlin中如何将HashMap内冒号分隔的字段拆分为多列导出CSV

Kotlin CSV列拆分实现方案

你只需要调整表头生成、行数据拼接两部分逻辑即可,修改后的完整代码如下:

binding.btnSave.setOnClickListener() {
    Sdata = viewModel.savehash
    Log.d(TAG, "CSV VIEW: ${Sdata.keys}")
    Log.d(TAG, "CSV VIEW: ${Sdata.values.size}")
    if(Sdata.isNotEmpty()) {
        val csv = File(this.filesDir, "test1.csv") // 应用内部存储
        val valuesSeparator = ","
        val lineTerminator = "\r\n"
        // 配置拆分后的列名后缀,可根据实际需求修改长度、命名
        val splitSuffixes = listOf("W", "X", "Y", "Z")

        // 生成拆分后的表头,每个原始key对应4个新列
        csv.writeText(
            Sdata.keys
                .flatMap { originalKey -> splitSuffixes.map { suffix -> "${originalKey}${suffix}" } }
                .joinToString(
                    separator = valuesSeparator,
                    postfix = lineTerminator
                )
        )

        val nRows = Sdata.values.maxOf { it.size }
        for (i in 0 until nRows) {
            val row = Sdata.values
                // 先取当前行的原始单元格内容
                .map { it.getOrElse(i) { "" }.trim() }
                // 每个单元格按冒号拆分,不足4位补空,超过4位只取前4位
                .flatMap { cellValue ->
                    val splitParts = cellValue.split(":").map { it.trim() }
                    splitParts.take(splitSuffixes.size).padEnd(splitSuffixes.size, "")
                }
                .joinToString(separator = valuesSeparator, postfix = lineTerminator)
            csv.appendText(row)
        }
        Toast.makeText(this, "数据已保存到应用存储目录", Toast.LENGTH_SHORT).show()
    } else {
        Toast.makeText(this, "无有效数据可保存", Toast.LENGTH_SHORT).show()
    }
}

关键逻辑说明

  • 如果你需要调整拆分的列数、列名后缀,直接修改splitSuffixes列表即可,其他逻辑无需改动
  • 代码兼容单元格内容为空、拆分后字段不足/超过预期列数的边界场景,不会出现数组越界报错

内容的提问来源于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.25 16:06:03