PowerShell如何不通过名称、按位置或ID引用CSV列或属性
解决方案
方法1:直接通过属性索引访问(原生支持,无需额外预处理)
PowerShell的自定义对象都自带PSObject.Properties集合,按CSV列的导入顺序排序,索引从0开始计数,直接通过索引即可读取/修改对应列的值,无需输入完整属性名。
示例代码(对应你原需求修改First Name列的值):
$data = Import-CSV .\data.csv | ForEach-Object { # 索引1对应第二列 First Name if ($_.PSObject.Properties[1].Value -eq "Bob") { $_.PSObject.Properties[1].Value = "Robert" } $_ }
方法2:预存表头数组复用(代码更简洁)
如果嫌写PSObject.Properties太长,可以提前提取一次表头数组,后续直接用下标取对应表头名动态访问属性:
# 提取CSV表头,顺序与列顺序完全一致 $colHeaders = (Get-Content .\data.csv -First 1).Split(" ", [StringSplitOptions]::RemoveEmptyEntries) $data = Import-CSV .\data.csv | ForEach-Object { if ($_.$($colHeaders[1]) -eq "Bob") { $_.$($colHeaders[1]) = "Robert" } $_ }
以上两种都是PowerShell原生支持的实现,不需要提前创建大量变量,也不需要修改导入表头后再还原,非常适合临时快速处理数据的场景。需要注意列索引从0开始计数,使用前确认好目标列的位置即可。
内容的提问来源于stack exchange,提问作者immobile2
相关产品推荐
相关产品推荐

