使用PowerShell按部门号规则将CSV列值复制至新列
PowerShell处理CSV:按部门编号规则新增列并填充值
我有一个包含4列的CSV文件,需要根据DepartmentNumber列的规则(部门编号以8开头),将Costs列的值复制到新增的CorpCosts列中。
原始CSV内容
| Employee ID | OwnerEmail | DepartmentNumber | Costs |
|---|---|---|---|
| fg345 | test@mail.com | 8894 | 4654.45 |
| 78f54 | test2@mail.co | 3453 | 4994.15 |
预期处理结果
| Employee ID | OwnerEmail | DepartmentNumber | Costs | CorpCosts |
|---|---|---|---|---|
| fg345 | test@mail.com | 8894 | 4654.45 | 4654.45 |
| 78f54 | test2@mail.co | 3453 | 4994.15 |
尝试的错误代码
$corpcosts= foreach($corpcost in $CSVImport.corpcosts){ if($CSVImport.DepartmentNumber -eq "8*"){ $CSVImport.DepartmentNumber + $CSVImport.Costs } } $CSVImport|Select-Object *, @{N= 'CorpCosts'; E={$corpcosts[$_.CorpCosts]}} |Export-Csv "$Env:temp/$OutputFile" -NoTypeInformation
错误分析
- 遍历的
$CSVImport.corpcosts不存在,原始CSV无此列,循环无法执行 - 使用
-eq "8*"做匹配,-eq是精确匹配,无法识别通配符,应改用-like - 引用全局的
$CSVImport而非当前行对象$_,无法逐行判断条件 - 错误拼接部门编号和成本值,需求仅需复制
Costs列的值
正确解决方案
# 导入目标CSV文件 $CSVImport = Import-Csv -Path "你的CSV文件路径.csv" # 处理数据并导出结果 $CSVImport | Select-Object *, @{ Name = 'CorpCosts' Expression = { # 逐行判断部门编号是否以8开头,满足则返回Costs值,否则返回空 if ($_.DepartmentNumber -like "8*") { $_.Costs } } } | Export-Csv -Path "$Env:temp/$OutputFile" -NoTypeInformation
代码说明
Import-Csv:读取CSV文件并转换为PowerShell对象集合Select-Object *:保留原有的所有列- 计算属性
@{Name='CorpCosts'; Expression={...}}:新增CorpCosts列,通过表达式逻辑填充值 -like "8*":匹配以8开头的字符串,实现规则判断Export-Csv:将处理后的对象集合导出为CSV文件,-NoTypeInformation避免生成多余的类型信息行
内容的提问来源于stack exchange,提问作者CoCoBl
相关产品推荐
相关产品推荐

