使用通配符将CSV单元格内容替换为PowerShell

使用通配符将CSV单元格内容替换为PowerShell,powershell,csv,wildcard,Powershell,Csv,Wildcard,我正试图让PowerShell处理一些CSV数据 我试图在我的CSV中操作的列包含文本形式的库存水平,主要包含“高”、“好”、“中”、“低”和“缺货”,我希望在一天结束时将CSV导入网站之前将其转换为数字格式 我目前的代码是: #Declare Stock Level Words To Value $StockLevelWordToValue = @{ "High" = "70" "Good" = "50" "Medium" = "30" "Low" = "10"

我正试图让PowerShell处理一些CSV数据

我试图在我的CSV中操作的列包含文本形式的库存水平,主要包含“高”、“好”、“中”、“低”和“缺货”,我希望在一天结束时将CSV导入网站之前将其转换为数字格式

我目前的代码是:

#Declare Stock Level Words To Value
$StockLevelWordToValue = @{
    "High" = "70"
    "Good" = "50"
    "Medium" = "30"
    "Low" = "10"
    "Out Of Stock" = "0"
}

# import the CSV file
$csv = Import-Csv "C:\temp\temp.csv";

# for each row, replace the Stock Level Word field with a value
foreach($row in $csv) {
    $row."Stock Level" = $StockLevelWordToValue[$row."Stock Level"];
}

# export the modified CSV
$csv | Export-Csv "C:\temp\temp2.csv" -NoTypeInformation;
我的问题是在我的“库存水平”栏中,有些条目像“良好:2019年8月的最后更新”或“高:2019年3月的最后更新”

当前,运行此代码时,这些条目没有返回值,单元格为空

我希望通配符可以像这样工作:

"Good*" = "50"
但这也会返回一个空白单元格


如何检查一个单元格“包含”一个单词并返回一个数值,而不管该单元格中还有其他单词?

您可以使用
Select String
通过“High*”等模式检查属性的值。如果找不到任何,则返回null;如果有与此模式匹配的字符串,则返回true

foreach($row in $csv) {
     If ($row."Stock Level" | Select-String "High*) {
          $row."Stock Level" = $StockLevelWordToValue["High"];
    }
  }

你有一个好的开始。[grin]但是,在查找表[hashtables]中不能使用这样的通配符。相反,解析CSV列值以将其修剪回键。看起来您可以使用
.Split(“:”)[0].Trim()
只获取与查找键值匹配的部分。谢谢Lee,这就是我所做的。因此,我意识到,如果我把字符长度缩短,我可以为stock level列得到5个一致的值。我把它删减到了3个字符,所以我的结尾是“Hig”,“Goo”,“Med”,“Low”或“Out”-之后添加的任何日期都无关紧要。然后运行上面的脚本将其更改为等效值。neato!很高兴知道你能按需要工作。。。[咧嘴笑]谢谢你,埃里克,这是一个很好的方法,很好地了解未来。