【问题标题】:Modifying Column Within Array修改数组中的列
【发布时间】:2018-12-18 16:18:23
【问题描述】:

我正在读取一个包含 25,000 条记录的 CSV 文件,并将每一列读入 psobject。这是我目前所拥有的:

$file = Import-CSV .\server.csv
$tempobj = New-Object psobject -Property @{
    'Name' = $file.Name
    'Group' = $file.Group
}

运行时,我得到了我想要的正确结果,因为$file.Name 包含所有服务器名称,$file.Group 包含服务器组。但是,我的问题是我需要在不干扰.Group 的情况下编辑每个服务器的名称。下面是一个服务器名称的示例。

WindowsAuthServer @{wdk9870WIN}

我需要从每个服务器名称中删除 WindowsAuthServer @{WIN},只留下服务器名称,或者在本例中为 wdk9870

我尝试使用 -replace 函数 ($tempobj.Name -replace "WindowsAuthServer @{",""),但它要求我将结果保存到一个新数组中,然后它会搞砸或完全删除 .Group

有没有其他方法可以做到这一点?我迷路了。

【问题讨论】:

  • 每一列已经pscustomobject,因为您使用的是Import-Csv。您正在双重处理每条记录。此外,您正在查看pscustomobject 的字符串表示形式;该字符串不是字面上的WindowsAuthServer @{wdk9870WIN}。键 WindowsAuthServer 包含值 wdk9870WIN

标签: powershell csv formatting psobject


【解决方案1】:

假设您的 server.csv 如下所示:

"Name","Group"
"WindowsAuthServer @{wdk9870WIN}","Group1"
"WindowsAuthServer @{wdk9880WIN}","Group2"
"WindowsAuthServer @{wdk9890WIN}","Group1"
"WindowsAuthServer @{wdk9900WIN}","Group1"

而您只想更改 Name 列中的值,那么可能会这样做:

Import-Csv .\server.csv | ForEach-Object {
    New-Object psobject -Property @{
        'Name' = ([regex]'@\{(\w+)WIN\}').Match($_.Name).Groups[1].Value
        'Group' = $_.Group
    }
}

这将输出:

Name    Group 
----    ----- 
wdk9870 Group1
wdk9880 Group2
wdk9890 Group1
wdk9900 Group1

如果需要,您可以简单地将此信息通过管道传输到 Export-Csv cmdlet 以另存为新的 CSV 文件。为此,只需将| Export-Csv -Path .\server_updated.csv -NoTypeInformation 附加到代码中即可。

希望有帮助

【讨论】:

  • 他们的数据实际上看起来不太可能。他们更有可能正在查看控制台并且不明白 powershell 中的所有内容都是一个对象,因此它是用于控制台打印的 pscustomobject 的字符串表示形式。
  • @TheIncorrigible1 是的,很可能是这种情况,但如果我查看 OP 的 previous question 我不能确定..
  • 哎呀。我真诚地希望他们不会以某种方式对 csv 执行 | Out-String | Out-File 之类的操作。
猜你喜欢
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2021-05-19
  • 2014-06-22
  • 2015-01-14
相关资源
最近更新 更多