我有个csv文件。我正在使用select-string搜索一个值。我需要标识特定列$LineCui上返回的值
$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======='返回的值是
=====Match是is=======
@{Vendorid=1025;Cui=15293910;Data=2022-08-11;iStaus=-1;CashVat=False}
=====Match was=======
但是下面的代码行不返回值
'=====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只是一行文本,而不是哈希表格式。
发布于 2022-10-13 11:59:33
$sLine不是哈希表,而是由Select-String拒绝的MatchInfo对象。
sls在这里做的另一件事是将数组中的每个对象转换为字符串表示(类似于哈希表定义),然后将模式与该字符串匹配。因此,它还将匹配大括号、分号和属性名称。
但是,如果您已经将csv文本转换为对象数组,则可以直接搜索它,不需要使用select-string:$csvText | Where-Object Cui -EQ '15293910'。
或者在原始csv:$sls = $sText | Select-String '15293910'上使用select-string如果您跳过-SimpleMatch,您将在MatchInfo:$sls.Matches中捕获到文本(这也适用于您的原始示例)。
发布于 2022-10-13 11:58:46
您可以使用Where选择器。
$sLine = $csvText | where {$_.Cui -eq 15293910}
$sLine.CashVat 它将返回False
https://stackoverflow.com/questions/74054852
复制相似问题