合并不同结构CSV文件的最佳工具及结构差异查看方案
解决方案
工具选择
根据你的文件规模和使用习惯,分两类场景选工具即可:
- 无代码场景:
- 列差异对比:直接用VS Code安装Rainbow CSV插件,打开CSV文件后可以直接查看完整列名列表,两个文件的列名做个简单差集就能定位差异,大文件也不会卡顿;如果习惯命令行操作,用
csvkit工具包,执行csvcut -n 你的文件.csv就能直接打印所有列的序号和名称,和另一个文件的输出做diff就能快速找出缺失列。 - 批量补列/合并:用Excel/Power BI自带的Power Query,导入文件夹下所有CSV文件时,功能会自动识别所有文件的全量列,缺失列自动补空值,不需要手动配置列映射,处理完成直接导出统一结构的CSV即可。
- 列差异对比:直接用VS Code安装Rainbow CSV插件,打开CSV文件后可以直接查看完整列名列表,两个文件的列名做个简单差集就能定位差异,大文件也不会卡顿;如果习惯命令行操作,用
- 轻量脚本场景:pandas完全能满足需求,你根本不需要手动枚举所有列,你之前测试的
pd.concat本身就自带列自动对齐逻辑——你示例代码里没有手动指定column2、column3,合并后自动补全了NaN值就是这个特性在生效。
可直接复用的pandas脚本
下面的脚本不需要手动写任何列名,自动遍历目标文件夹下的所有CSV,自动识别全量列,支持两种输出模式:直接合并为单个大文件,或者给每个原文件补全缺失列后单独保存。如果是几十G级别的大文件,只读表头做列对比、分块读取即可,不会出现内存溢出问题。
import pandas as pd import os # 替换为你存放CSV文件的本地文件夹路径 CSV_FOLDER = "./csv_files" all_dfs = [] # 遍历读取所有CSV文件 for file_name in os.listdir(CSV_FOLDER): if file_name.lower().endswith(".csv"): file_path = os.path.join(CSV_FOLDER, file_name) # 大文件读取可以加chunksize参数分块加载,避免占满内存 df = pd.read_csv(file_path, low_memory=False) all_dfs.append(df) # 自动对齐所有列,缺失值自动填充NaN merged_data = pd.concat(all_dfs, ignore_index=True) full_columns = merged_data.columns.tolist() # --- 输出模式二选一 --- # 模式1:直接导出为合并后的单个大文件,适合直接导入QuickSight merged_data.to_csv("./merged_result.csv", index=False) # 模式2:给每个原文件补全缺失列后单独保存 # for index, df in enumerate(all_dfs): # fixed_df = df.reindex(columns=full_columns) # fixed_df.to_csv(f"./fixed_csv_{index}.csv", index=False)
如果只需要对比两个CSV的列差异,不需要加载全量数据,只读表头就能秒出结果:
# 只读取表头,不加载实际数据,大文件也能瞬间完成 df1_cols = set(pd.read_csv("file1.csv", nrows=0).columns) df2_cols = set(pd.read_csv("file2.csv", nrows=0).columns) print(f"文件1独有列:{df1_cols - df2_cols}") print(f"文件2独有列:{df2_cols - df1_cols}") print(f"全量列集合:{df1_cols | df2_cols}")
QuickSight适配提示
如果你的CSV是存放在AWS S3上的,不需要本地合并处理后再上传:只要保证所有CSV的列名一致(列顺序不影响),在QuickSight里直接配置S3路径前缀为数据源,服务会自动扫描路径下所有CSV文件做合并,省掉本地处理大文件的步骤。
内容的提问来源于stack exchange,提问作者Fariman Kashani
相关产品推荐
相关产品推荐

