如何获取包含 2 列的文件并将第一列与 CSV 进行比较,然后在 PowerShell 中将 CSV 更新为第二列数据?

问题描述 投票:0回答:1

可能还有另一种方法可以实现这一点,但这是我目前的想法。我想替换 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

如果您需要更多信息,请告诉我。这是我第一次在这样的论坛发帖!

谢谢, 亚当

powershell export-to-csv
1个回答
0
投票

解决此类问题的方法通常是使用字典类型,在本例中是哈希表,您可以将其用作查找表或相关表。

$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
© www.soinside.com 2019 - 2024. All rights reserved.