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
相关产品推荐
相关产品推荐

