使用PowerShell读取和写入相同的CSV

时间:2019-08-29 05:40:14

标签: powershell csv

我有一个带有“名称”和“状态”列的CSV文件。我们需要从CSV文件中读取名称,并对此执行一系列操作,一旦对一个名称完成操作,就需要在同一.csv文件中将该名称的状态更新为“已完成”。

Name        Status
poc_dev_admin   
poc_dev_qa  
poc_dev_qa1 
poc_dev_qa2 
poc_dev_qa3 
poc_dev_qa7 
poc_dev_qa8 
poc_dev_ro  
poc_dev_support 
poc_dev_test1   
poc_dev_test14  
poc_dev_test15  
poc_dev_test16  

执行plt.imshow(img)后,CSV文件应如下所示:

Name    Status
poc_dev_admin   Completed
poc_dev_qa  
poc_dev_qa1 
poc_dev_qa2 
poc_dev_qa3 
poc_dev_qa7 
poc_dev_qa8 
poc_dev_ro  
poc_dev_support 
poc_dev_test1   
poc_dev_test14  
poc_dev_test15  
poc_dev_test16  

我尝试使用此逻辑,它会更新所有组的“状态”列,而不是在处理相应的组后进行更新。我可以做些什么改变才能按预期工作吗?

poc_dev_admin

2 个答案:

答案 0 :(得分:1)

类似的东西应该可以满足您的描述:

$file = 'c:\test\abintm.csv'

$csv = Import-Csv $file

foreach ($row in $csv) {
    $groupname = $row.Name
    # ...
    # process $groupname
    # ...
    $row.Status = 'Completed'
}

$csv | Export-Csv $file -NoType

如果需要在处理下一条记录之前更新CSV,则可以将CSV导出置于循环的末尾(将$row.Status设置为“已完成”之后)。

答案 1 :(得分:0)

针对您指定的用例修改了代码,

  1. 在foreach循环中将当前项目变量更改为$row而不是$groupname
  2. 但是,在foreach块中定义了$groupname变量
$List = Import-Csv -Path "c:\test\abintm.csv"


foreach ($row in $List) {

    $groupName = $row.Name
    $status = $row.Status

    if ($groupName -eq "poc_dev_admin") {
        $status = "Completed"
        ($List | ? { $_.Name -eq $groupName }).Status = $status
    }

}

if (($List | ? { $_.Status -eq "Completed" }) -ne $null) {
    # $List has been modifed and hence write back the updated $List to the csv file
    $List | Export-Csv -Notypeinformation -Path "C:\test\abintm.csv"
}
# else nothing is written
相关问题