如何用PowerShell通过两列文本文件匹配并更新CSV指定列数据?
解决CSV列映射替换问题
你的核心需求是用User.txt的映射关系,把Data.csv里Built By列的旧值替换成标准值,但当前代码因匹配逻辑错误导致列被清空,下面是修正方案:
问题根源
- Compare-Object用法错误:这个命令用于对比两个集合的差异,不适合做单值匹配查找,导致你无法获取正确的映射值。
- 属性修改方式冗余:
Import-Csv已经为Data.csv的每一行创建了Built By属性,无需用Add-Member重新添加,直接赋值即可。
正确实现代码
# 1. 导入映射文件并转换成哈希表(键:旧数据,值:目标数据) $userMap = @{} Import-Csv -Path "D:\Users.txt" | ForEach-Object { $userMap[$_.OldData] = $_.'Built By' } # 2. 导入待处理的CSV数据 $data = Import-Csv "D:\Data.csv" # 3. 遍历每一行,替换Built By列的值 foreach ($record in $data) { # 检查当前Built By的值是否在映射表中存在 if ($userMap.ContainsKey($record.'Built By')) { # 替换为映射后的目标值 $record.'Built By' = $userMap[$record.'Built By'] } # 可选:如果没有匹配到,可添加自定义逻辑(比如保留原值/标记为无效) # else { $record.'Built By' = "未匹配" } } # 4. 导出处理后的CSV $data | Export-Csv "D:\Data-Updated.csv" -NoTypeInformation
代码说明
- 哈希表映射:把
User.txt内容转换成哈希表后,匹配查找效率会大幅提升,数据量越大优势越明显。 - 直接属性赋值:直接修改
$record.'Built By'的值,避免了重新添加属性可能带来的覆盖错误。 - 容错处理:通过
ContainsKey检查确保只有存在映射关系的值才会被替换,未匹配项可灵活处理。
内容的提问来源于stack exchange,提问作者Adam Sutherland
相关产品推荐
相关产品推荐

