如何使用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
相关产品推荐
相关产品推荐

