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

如何使用Scala合并多个CSV文件并调整记录顺序

用Scala合并并排序两个CSV文件

需求说明

现有两个CSV文件R-1.csv和R-2.csv,内容如下:

R-1.csv

empNo, slotNo
13648,[49 50 51 52 53 54 55 56 41 42 43 44 45 46 47 48 1-3-5-7]
24824,[52 51 53 50 37 36 38]

R-2.csv

empNo, slotNo
23241,[48 50 51 52 53 54 55 56 41 42 43 44 45 46 47 48 1-4-5-7]
09344,[59 51 53 50 37 36 38]

需要将两个文件合并为一个CSV,并按指定顺序排列记录,最终输出如下:

empNo, slotNo
13648,[49 50 51 52 53 54 55 56 41 42 43 44 45 46 47 48 1-3-5-7]
09344,[59 51 53 50 37 36 38]
24824,[52 51 53 50 37 36 38]
23241,[48 50 51 52 53 54 55 56 41 42 43 44 45 46 47 48 1-4-5-7]

原代码问题分析

之前提供的代码将empNo转为整数升序排序,会导致09344(转整数为9344)排在13648之前,和需求中的指定顺序不符,需要调整排序逻辑。

修正后的代码

如果需求是严格按照目标中的固定顺序排列,可通过定义排序优先级实现:

import java.io.File
import com.github.tototoshi.csv._

object CsvMergeExample extends App {
  // 定义目标排序的优先级(按empNo字符串顺序)
  val sortPriority = List("13648", "09344", "24824", "23241")

  // 读取CSV文件
  val reader1 = CSVReader.open(new File("R-1.csv"))
  val rows1 = reader1.all()
  reader1.close()

  val reader2 = CSVReader.open(new File("R-2.csv"))
  val rows2 = reader2.all()
  reader2.close()

  // 合并两个CSV,避免表头重复
  val header = rows1.head
  val mergedRows = header :: (rows1.tail ++ rows2.tail)

  // 按自定义优先级排序,表头固定在第一位
  val sortedRows = mergedRows.sortBy { row =>
    if (row == header) -1
    else sortPriority.indexOf(row.head)
  }

  // 写入合并后的CSV文件
  val writer = CSVWriter.open(new File("merged.csv"))
  writer.writeAll(sortedRows)
  writer.close()
}

代码说明

  • 表头处理:提取第一个文件的表头,仅保留一份,再合并两个文件的数据行(去掉各自的表头)。
  • 自定义排序:通过sortPriority列表定义目标顺序,排序时根据每行empNo在列表中的索引确定位置,确保顺序完全匹配需求。
  • 依赖说明:代码依赖tototoshi/csv库,需在项目中添加依赖(如sbt中添加libraryDependencies += "com.github.tototoshi" %% "scala-csv" % "1.3.10")。

内容的提问来源于stack exchange,提问作者Banu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:36:25