【问题标题】:Get specific item from a match of select-string从选择字符串的匹配中获取特定项目
【发布时间】:2022-10-17 16:52:39
【问题描述】:

我有一个 csv 文件。我正在使用选择字符串搜索一个值。 我需要识别特定列上的返回值 $线[崔]

$sLine= New-Object System.Collections.Hashtable
$sText = @"
Vendorid,Cui,Data,iStaus,CashVat
404,20955366,2022-08-11,1,True
1025,15293910,2022-08-11,-1,False
2022,27684873,2022-08-11,2,True
3055,29195059,2022-08-11,3,False
"@;
$csvText= $sText | ConvertFrom-csv -Delimiter ','
$sLine = $csvText |Select-string -Pattern '15293910' -SimpleMatch -Encoding utf8 

找到的对象看起来像一个哈希表

'=====Match is is======='
 $sLine
'=====Match was======='

返回值为
=====匹配是=======
@{供应商=1025;崔=15293910;数据=2022-08-11; iStaus=-1;现金增值税=假}
=====比赛是=======

但是下面的代码行没有返回值

'=====Get the desired value for the key======='
 $sLine['CashVat'].value
'================================='

在调试窗口中不返回任何内容

GetEnumerator 也不返回键值对

 $sLine.GetEnumerator() | ForEach-Object {
                          $message = '{0} is key {1} value' -f $_.key, $_.value
                          write-output $message
                         }  

只列出 <> 73 次,相当于 $sLine 变量的长度 看起来 $sLine 只是一行文本,而不是哈希表格式

【问题讨论】:

  • 您是否尝试过$sLine.GetType() 来验证它是什么类型。

标签: powershell


【解决方案1】:

$sLine 不是哈希表,而是 MatchInfo 对象由 Select-String 重用。

sls 在这里做的另一件事是将数组中的每个对象转换为字符串表示形式(看起来像哈希表定义),然后将模式与该字符串匹配。所以它也会匹配其中的花括号、分号和属性名称。

但是如果您已经将 csv 文本转换为对象数组,则可以直接搜索,无需使用 select-string:$csvText | Where-Object Cui -EQ '15293910'

或者在原始 csv 上使用选择字符串:$sls = $sText | Select-String '15293910' 如果您跳过 -SimpleMatch,您将在 MatchInfo 中捕获文本:$sls.Matches(这也适用于您的原始示例)。

【讨论】:

  • 我试图提取整行并访问该行的其他属性。但是我切换到 Where-Object 并使用多个参数进行了完整搜索
【解决方案2】:

您可以使用Where 选择器。

$sLine = $csvText | where {$_.Cui -eq 15293910}
$sLine.CashVat 

这将返回False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2012-03-01
    • 2016-07-08
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多