如何从多个CSV文件按表头批量提取指定列合并生成总CSV文件
解决方案
PowerShell 优化方案(适配现有技术栈)
核心优化逻辑是把需要提取的列名统一维护在一个数组中,通过循环动态生成计算属性配置,无需手动逐个编写20+次列定义,仅需一次维护列名列表即可。
完整可运行代码:
# ========== 仅需修改以下配置部分 ========== # 主键列名,两个CSV中都需要存在该列用于关联匹配 $joinKey = "HBA_ID" # 待提取列名列表,20+列直接按格式追加到数组中即可 $columnsToExtract = @( "TOPF_IQ_Zscore", "TMT_A_Zscore" # 后续需要新增的列直接按上面的格式加在这里 ) # 文件路径配置 $primaryCsvPath = $inputFilePath1 # 提供提取列的CSV路径 $secondaryCsvPath = $inputFilePath2 # 待合并的基础CSV路径 $outputFilePath = "master_file.csv" # 最终输出文件路径 # ========== 以下逻辑无需修改 ========== # 加载主键映射表 $primaryMapping = [ordered]@{} Import-Csv -Path $primaryCsvPath | ForEach-Object { # 自动跳过重复主键,避免报错 if (-not $primaryMapping.Contains($_.$joinKey)) { $primaryMapping[$_.$joinKey] = $_ } } # 动态生成计算属性列表 $calcProperties = $columnsToExtract | ForEach-Object { $currentCol = $_ @{ Name = $currentCol Expression = { $primaryMapping[$_.$joinKey].$currentCol }.GetNewClosure() } } # 合并并导出结果 Import-Csv -Path $secondaryCsvPath | Select-Object *, $calcProperties | Export-Csv -Path $outputFilePath -NoTypeInformation -Encoding UTF8
更简洁的Python实现(可选)
如果可以接受使用Python,用pandas库处理CSV合并逻辑更精简,代码量更少:
import pandas as pd # 配置部分 join_key = "HBA_ID" # 待提取列名列表,直接追加即可 columns_to_extract = [ "TOPF_IQ_Zscore", "TMT_A_Zscore" ] # 文件路径 primary_path = "第一个CSV路径.csv" secondary_path = "第二个CSV路径.csv" output_path = "master_file.csv" # 读取并合并 df_primary = pd.read_csv(primary_path, usecols=[join_key] + columns_to_extract).drop_duplicates(join_key) df_secondary = pd.read_csv(secondary_path) df_merged = df_secondary.merge(df_primary, on=join_key, how="left") # 导出结果,utf-8-sig编码兼容Excel打开 df_merged.to_csv(output_path, index=False, encoding="utf-8-sig")
注意事项
- 关联主键需保证在两个CSV中都存在,值格式保持一致
- 如果需要合并2个以上的CSV,仅需在配置部分追加文件路径,扩展对应合并逻辑即可
- 导出时指定UTF8编码可避免非英文字符乱码问题
内容的提问来源于stack exchange,提问作者Hannah Anderson
相关产品推荐
相关产品推荐

