【问题标题】:Using a wildcard to replace CSV cell contents with PowerShell使用通配符将 CSV 单元格内容替换为 PowerShell
【发布时间】:2019-09-19 23:28:19
【问题描述】:

我正在尝试让 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"

但这也会返回一个空白单元格。

如何检查一个单元格“包含”一个单词并返回一个数值,无论该单元格中还有什么其他单词?

【问题讨论】:

  • 你有一个好的开始。 [grin] 但是,您不能将通配符与查找表 [hashtables] 一起使用。相反,解析您的 CSV 列值以将其修剪回仅键。看起来您可以使用 .Split(':')[0].Trim() 来获取与您的查找键值匹配的部分。
  • 谢谢李,这就是我所做的(有点)。因此,我意识到,如果我将字符长度缩短,我最终可以得到 5 个库存级别列的一致值。我已将其缩减为 3 个字符,因此我以“Hig”、“Goo”、“Med”、“Low”或“Out”结尾——那么之后添加的任何日期都无关紧要。然后运行上述脚本将其更改为等效值。
  • neato!很高兴知道你让它按需要工作了……[grin]

标签: powershell csv wildcard


【解决方案1】:

您可以使用Select-String 通过“高*”等模式检查您的属性值。如果没有找到任何内容,这将返回 null,如果有匹配此模式的字符串,则返回 true。

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

【讨论】:

  • 感谢 Erick,这是一种很好的方法,对未来很有帮助。 ?
猜你喜欢
  • 2015-05-07
  • 2017-02-02
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多