可能还有另一种方法可以实现这一点,但这是我目前的想法。我想替换 CSV 文件的列中的特定值。 CSV 在某些值前面有不需要的文本,大小写不一致,所以我想清理它。
我创建了一个
User.txt
文件,其中 OldData,NewData
作为标题行。我认为这种方法是最干净的。当新员工加入或老员工离开时,我可以直接编辑这个 User.txt 文件,而不是直接更新 PowerShell。
示例用户.txt
"OldData","Built By"
"Group-FirstName1","Initials1"
"firstname2","Initials2"
"First Name3","Initials3"
"RandomText-FirstName4","Initials4"
Data.csv 自动生成,共 9 列。
"Column1","Column2","Column3","Column4","Column5","Column6","Column7","Column8","Built By"
Built By
列的值等于我的 OldData
文件中的 User.txt
。我想将 OldData
中的 NewData
替换为 Data.csv
。
我以各种方式使用了
Import-CSV
命令,但我没有使用带有用户信息的单独 .txt 文件的具体示例。
下面的代码删除了“构建者”列中的所有内容。
$Users = Import-Csv -Path "D:\Users.txt"
$Data = Import-Csv "D:\Data.csv"
ForEach($Record in $Data){
$MatchedValue = (Compare-Object $Users $Record -Property "OldData" -IncludeEqual -ExcludeDifferent -PassThru).value
$Record = Add-Member -InputObject $Record -Type NoteProperty -Name "Built By" -Value $MatchedValue -Force
}
$Data|Export-Csv "D:\Data-Updated.csv" -NoTypeInformation
如果您需要更多信息,请告诉我。这是我第一次在这样的论坛发帖!
谢谢, 亚当
解决此类问题的方法通常是使用字典类型,在本例中是哈希表,您可以将其用作查找表或相关表。
$map = @{}
# create a dictionary that will be used later on for replacements
foreach ($row in Import-Csv User.txt) {
$map[$row.OldData] = $row.'Built By'
}
Import-Csv 'Data.csv' | ForEach-Object {
# if the value of Built By exists in User.txt -> OldData
if ($map.ContainsKey($_.'Built By')) {
# assign the Built By value from User.txt
$_.'Built By' = $map[$_.'Built By']
}
else {
# the value doesn't exist in User.txt, so assign "Missing"
$_.'Built By' = 'MISSING'
}
# output the object (the row)
$_
} | Export-Csv 'Data-Updated.csv' -NoTypeInformation