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

如何用Miller工具合并3个及以上首列相同的CSV文件?

用Miller合并多列匹配的CSV文件

问题分析

你的场景是多个CSV文件第一列(date)完全一致,需要按列横向合并。直接使用多文件join命令会因为Miller的多文件join逻辑(每个后续文件单独与第一个左文件join)导致额外列,正确的做法是链式逐步合并。

解决方案

1. 清理表头空格(可选,匹配你的期望输出)

你的示例文件表头存在空格(如date, a),先清理每个文件的表头空格:

# 清理csv_1的表头空格
mlr --csv rename ' *,*' csv_1 > cleaned_csv1.csv
# 清理csv_2的表头空格
mlr --csv rename ' *,*' csv_2 > cleaned_csv2.csv
# 清理csv_3的表头空格
mlr --csv rename ' *,*' csv_3 > cleaned_csv3.csv

2. 链式合并多个文件

先合并前两个文件,再将结果与第三个文件合并,用管道传递中间结果:

mlr --csv join -u -j date -f cleaned_csv1.csv cleaned_csv2.csv | mlr --csv join -u -j date -f - cleaned_csv3.csv > output.csv

3. 验证输出

最终output.csv内容会和你期望的一致:

date,a,t,q
1,b,h,w
2,c,j,e
3,d,k,r

扩展到更多文件

如果有更多CSV文件,继续链式拼接即可,比如合并4个文件:

mlr --csv join -u -j date -f cleaned_csv1.csv cleaned_csv2.csv | mlr --csv join -u -j date -f - cleaned_csv3.csv | mlr --csv join -u -j date -f - cleaned_csv4.csv > output.csv

为什么直接多文件join不行?

Miller的join -f file1 file2 file3逻辑是:将file2、file3分别与file1做join操作,而非将file2与file1合并后再和file3合并,这会导致重复引入file1的列,最终出现额外列。链式合并则是基于前一次的合并结果继续join,保证列的正确累加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:28:29