【问题标题】:Powershell: Setting values of a filtered arrayPowershell:设置过滤数组的值
【发布时间】:2011-03-05 01:24:48
【问题描述】:

我想读入一个 csv 文件,根据两个的值过滤它 字段并设置另一个字段的值。这是一个简单的例子 我想要达到的目标:

c:\somefile.csv 内容:

firstField,secondField,thirdField
1,2,"somevalue"
2,2,"avalue"
3,1,"somevalue"

#Import file into array
$csv = Import-Csv c:\somefile.csv

# Where secondField = 2 and thirdField = "someValue" set thirdField =
"anotherValue"
$csv | where {$_secondField -eq 2 -and $_.thirdField = "somevalue"} |
<set value of thirdField = "anotherValue">

我该怎么做。如您所见,从示例中,我可以阅读 并过滤数组。但我不知道如何设置 第三场。我尝试了 set-itemproperty 但收到错误:“ 管道后无法调用 WriteObject 和 WriteError 方法 已关闭”。

编辑:我也只想更改返回的前 2 个项目(行)的值。 我回答:我使用 Select -first 2。

任何关于如何实现这一点的建议将不胜感激。

艾伦·T

【问题讨论】:

    标签: arrays powershell csv


    【解决方案1】:

    我稍微修改了你的代码:

    $csv | 
        Where-Object {$_.secondField -eq 2 -and $_.thirdField -eq 'somevalue'} |
        Foreach-Object { $_.thirdField = 'anotherValue' }
    
    • $_secondField => $_.secondField
    • $_.thirdField = "somevalue" 应该是 $_.thirdField -eq "somevalue"
    • Foreach-Object 设置第三个值。在这种情况下,它只处理 1 条记录,但基本上它会处理通过管道输入的所有记录(只需尝试删除 Where 部分)。
    • 由于意外的变量扩展,使用单引号而不是双引号“更安全”。

    【讨论】:

    • 自我注意:确保 CSV 中的标题行没有尾随空格......这让我在过去几分钟的测试中感到厌烦......
    【解决方案2】:

    你的想法是对的。使用Where-Object(别名为Where)过滤管道中的对象,然后进一步向下使用Foreach-Object(别名为Foreach)设置值,如下所示:

    $csv | where {$_secondField -eq 2 -and $_.thirdField -eq "somevalue"} | 
        foreach {$_.thirdField = "notherValue"}
    

    将 Where-Object 视为一种过滤机制,将 Foreach-Object 视为管道机制,允许您将任意脚本应用于每个管道对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多