如何在Power Query中从.csv文件导入选定列并动态追加合并数据
动态合并多CSV文件并保留固定列实现方案
核心逻辑
方案完全适配后续CSV文件新增冗余字段、列顺序调整的场景,只要你需要保留的固定列名不发生变更,就可以稳定运行,不需要调整代码/配置:
- 遍历目标路径下所有.csv格式文件
- 读取单个文件时先识别表头,仅提取预先指定的目标列,自动忽略所有无关字段
- 将所有文件提取出的目标列数据逐行追加,最终合并为单张表
- 增加基础校验:如果单个文件缺失必填列,直接输出文件名和缺失列名提示,避免脏数据混入
方案1:Python + Pandas 实现(适合批量处理/自动化调度场景)
适配性最强,不受文件数量、文件大小限制,读取阶段就过滤冗余列,内存占用低。
首先安装依赖:pip install pandas
使用时仅需要修改代码开头的3个配置项即可:存放CSV的文件夹路径、需要保留的列名列表、合并后文件的输出路径。
import os import pandas as pd # -------------------------- 自定义配置项 -------------------------- CSV_FOLDER = "./csv_files" # 替换为存放所有待合并CSV的文件夹路径 TARGET_COLUMNS = ["NAME", "ADDRESS", "EMAIL"] # 固定保留的列名,需和CSV内列名拼写/大小写一致 OUTPUT_PATH = "./merged_result.csv" # 合并结果的保存路径 # ----------------------------------------------------------------- def merge_csv(): df_list = [] for fname in os.listdir(CSV_FOLDER): if not fname.lower().endswith(".csv"): continue fpath = os.path.join(CSV_FOLDER, fname) try: # 读取时仅加载目标列,自动跳过所有无关字段 df = pd.read_csv(fpath, usecols=lambda c: c in TARGET_COLUMNS) # 校验当前文件是否缺失必要列 miss_cols = [c for c in TARGET_COLUMNS if c not in df.columns] if miss_cols: print(f"[警告] 文件 {fname} 缺失列:{','.join(miss_cols)},已跳过") continue df_list.append(df) print(f"已处理:{fname},行数:{len(df)}") except Exception as e: print(f"[错误] 处理 {fname} 失败:{str(e)}") continue if not df_list: print("未读取到有效数据,请检查路径和列名配置") return # 追加合并所有数据 final_df = pd.concat(df_list, ignore_index=True) final_df.to_csv(OUTPUT_PATH, index=False, encoding="utf-8-sig") print(f"合并完成,总行数:{len(final_df)},结果已保存至 {OUTPUT_PATH}") if __name__ == "__main__": merge_csv()
关键说明:核心过滤逻辑依赖列名匹配而非列位置,后续供应商不管新增多少字段、怎么调整列顺序,只要不修改TARGET_COLUMNS里指定的三个列名,代码不需要任何改动即可正常运行。
方案2:Excel Power Query 实现(无代码场景,适合日常办公使用)
不需要写代码,用Excel自带功能即可实现,后续更新数据只需要点刷新:
- 将所有待合并的CSV文件放入同一个独立文件夹
- 新建空白Excel,点击顶部菜单栏「数据」>「获取数据」>「自文件」>「自文件夹」,选择存放CSV的文件夹后点击确定
- 在弹出的文件列表页,直接点击「转换数据」进入Power Query编辑器,不要点默认的合并按钮
- 点击「内容」列标题旁的双向展开箭头,取消全选,仅勾选NAME、ADDRESS、EMAIL三个需要保留的列,去掉「使用原始列名作为前缀」的勾选,点击确定
- 此时所有数据已完成合并和列过滤,后续如果文件夹内新增CSV、或者原有CSV新增了无关字段,只需要点击「数据」选项卡下的「刷新」按钮,结果会自动更新,不需要重复配置
- 点击「关闭并上载」,即可将合并结果导出到Excel工作表
避坑提示
- 不要使用按列位置读取的逻辑(比如固定读取第1、2、3列),一旦供应商在文件中插入新列、调整列顺序,会直接导致数据错位
- 如果不同文件的目标列名存在大小写不一致、前后有空格的情况,可以在读取时统一把列名转成大写、去除首尾空格后再做匹配,避免漏列
- 遇到CSV中文乱码的问题,在
pd.read_csv中添加encoding参数指定对应编码即可,国内常用的编码为gbk、utf-8
内容的提问来源于stack exchange,提问作者GTB
相关产品推荐
相关产品推荐

