我希望你能帮助我。我使用两个ArrayLists:
array1填充了log.csv(包含头和登录数据,列'pc'的值是唯一的)。它被定义为ArrayList,因为我想添加条目。
#pc,name,date,city
#pc-x,name-1,2017-01-01,berlin
#pc-y,name-1,2017-01-02,berlin
#pc-z,name-2,2017-01-02,munich
[System.Collections.ArrayList]$array1 = Import-Csv log.csv
在运行时期间填充array2
$array2=[System.Collections.ArrayList]@()
... ForEach-Object {
$array2.Add([PSCustomObject]@{ pc=$pcname
name=$loginname
date=$logindate }) >$null }
我想做什么: 更新array1.date = array2.date,其中array1.pc = array2.pc
如果在array1中找不到任何条目,我想添加它:
$array1.Add([PSCustomObject]@{ pc=$pcname
name=$loginname
date=$logindate
city='[unknown]' }) >$null
最后再次导出array1:
$array1 | Export-Csv log.csv -Encoding UTF8 -NoTypeInformation
所以问题是:如何在array1中找到条目并更新它?现在努力工作几天......
答案 0 :(得分:0)
以下是我创建的可能有用的示例。注意:我使用List类型而不是ArrayList类型。此外,它假定要更新的数据中只有一个可能匹配的PC名称。您必须更改它才能更新文件,因为它只更新了第一个List变量。让我知道它是怎么回事。
[PSCustomObject]
{
[string] $pc,
[string] $name,
[string] $date,
[string] $city
}
[System.Collections.Generic.List[PSCustomObject]] $list1 = Import-Csv "C:\SOSamples\log.csv";
[System.Collections.Generic.List[PSCustomObject]] $list2 = Import-Csv "C:\SOSamples\log2.csv";
[PSCustomObject] $record = $null;
[PSCustomObject] $match = $null;
foreach($record in $list2)
{
# NOTE: This only retrieves the FIRST MATCHING item using a CASE-INSENSITIVE comparison
$match = $list1 | Where { $_.pc.ToLower() -eq $record.pc.ToLower() } | Select -First 1;
if($match -eq $null)
{
Write-Host "Not Found!";
$list1.Add($record);
}
else
{
Write-Host "Found!";
$match.date = $record.date;
}
}
Write-Host "--------------------------------------------------------------------"
foreach($record in $list1)
{
Write-Host $record
}
答案 1 :(得分:0)
尝试这样的事情:
:selected