使用' foreach '解析CSV文件会在输出中产生重复条目



我在编写以下PowerShell脚本并使用循环和分支时遇到了一个基本问题。似乎我在这里错过了一些非常简单的东西,但现在我不明白如何改进脚本。

下面是一个例子:

$mycsv = Import-Csv mycsv.csv
for ($i = 1 ; $i -le 123 ; $i++) {
$currentvalue = "OLD"
foreach ($value in $mycsv) {
switch ($value.oldValue) {
$currentvalue {
Write-Host "Number $i - $currentvalue replaced with $($value.newValue)"
}
default { Write-Host "Number $i - $currentvalue unchanged" }
}
}
}

mycsv.csv文件有以下三行:

oldValue,newValue
FOO,BAR
OLD,NEW
ABC,DEF

当前输出如下:

...
Number 123 - OLD unchanged
Number 123 - OLD replaced with NEW
Number 123 - OLD unchanged
...

可以看到,对于每个数字,脚本写了三行。这是预期的,因为脚本对CSV文件中的三个条目具有foreach循环。

但是我希望脚本显示操作的状态,而不是将每个条目的oldValue与newValue匹配的状态。

我需要在脚本中更改什么以使其显示"未更改";字符串或"已替换的"字符串?我是否需要在某个地方添加break以使脚本退出foreach循环?或者我需要用别的东西代替foreach吗?

PS我明白,我的脚本实际上并没有取代任何东西。它只显示基于$currentvalue和CSV文件中的条目的输出。

Update # 1

我正试图根据$currentvaluemycsv.csv中的行来Write-Host不同的文本。如果脚本在mycsv.csv的第一列中找到$currentvalue的值,则必须写"Number 1 - OLD替换为new";其中NEW取自CSV文件的同一行($value.newValue)。

您可以将其视为我使用CSV文件作为参考。例如,如果脚本解析文本文件并发现单词OLD,则需要将其替换为从CSV中获取的单词NEW。

我试图简化我的脚本,只留下相关的部分。它有更多的代码,但我故意省略了它,因为它在这个问题的上下文中并不重要。

我打算使用foreach来循环CSV文件中的条目,并将它们与$currentvalue匹配。当$currentvalue匹配CSV的第一列中的一个条目时,脚本需要将"编号1 -(取自第一列的单词)"替换为"(取自第二列的单词)"。

如果没有匹配,那么脚本应该写"Number 1 - $currentvalue unchanged&"。

所以应该只有两种输出类型:

"数字1 -(从第一列取字)替换为(从第二列取字)">(如果有匹配)

1 - $currentvalue unchanged">(如果没有找到匹配项)

脚本需要for循环,因为它必须遍历版本号。我将$i传递给命令行实用程序。我把这部分脚本删掉了,因为我觉得它在这里不重要。

给定此测试Csv:

$csv = @'
oldValue,newValue
FOO,BAR
OLD,NEW
ABC,DEF
BAZ,BAZ
'@ | ConvertFrom-Csv

我相信你想要的:

$csv | ForEach-Object { $idx = 1 } {
$status = 'unchanged'
if($_.oldValue -ne $_.newValue) {
# if it changed assign a new value
$status = 'replaced with {0}' -f $_.newValue
}

Write-Host ('Number {0} - {1} {2}' -f $idx++, $_.oldValue, $status)
}

输出:

Number 1 - FOO replaced with BAR
Number 2 - OLD replaced with NEW
Number 3 - ABC replaced with DEF
Number 4 - BAZ unchanged

我认为你应该采用面向对象的方法:

$csv | ForEach-Object {
$status = 'unchanged'
if($_.oldValue -ne $_.newValue) {
# if it changed assign a new value
$status = 'replaced with {0}' -f $_.newValue
}
# output a new object appending this new property
$_ | Select-Object *, @{ N='Status'; E={ $status }}
}

输出:

oldValue newValue Status
-------- -------- ------
FOO      BAR      replaced with BAR
OLD      NEW      replaced with NEW
ABC      DEF      replaced with DEF
BAZ      BAZ      unchanged

相关内容

  • 没有找到相关文章

最新更新