我正在对由CSV填充的数组使用foreach循环。 CSV包含产品名称行,当前支持状态以及启动支持时的版本号。有时这些支持版本以逗号分隔,原因有很多。
如果在一行中找到以逗号分隔的版本,则会从该数组中删除该行。然后创建一个新行并将其添加到每个找到的版本的数组中。
我遇到的问题是如果我有一个版本的“7,8,9”我最终会有三行所有列出版本9.对脚本进行故障排除表明这些值正在拆分并正确拾取,但是数组似乎正在用最新的数据更新每个值。例如,第一次传递将使版本7,第二次传递有两个v8实例,最后一次传递最终以v9为3次。
如何让+ =运算符不更新现有行?
foreach ($line in $sheet) { if ($line.'Support Started' -cmatch ",") { $sheet = $sheet -ne $line $line.'Support Started'.Split(",") | ForEach { $subver = $_ $line.'Support Started' = $subver $sheet = $sheet += ($line) } } }
如果我使用以下内容,请提供更多信息:
write-host $line $sheet += $line write-host $line
在7,8,9作为版本的文件上,我得到以下输出:
产品1,支持,7个
产品1,支持,7
产品1,支持,8
产品1,支持,8
产品1,支持,9
产品1,支持,9
检查$ sheet的值时,我得到:
产品1,支持,9个
产品1,支持,9
产品1,支持,9
答案 0 :(得分:1)
您确定没有使用Import-Csv读取文件吗?
你遇到问题的原因是你做的时候
foreach ($line in $sheet)
...
然后变量$ line不是$ sheet中行的副本,而是对sheet变量中行的引用。即当你更改$ line时,你实际上正在改变$ sheet。
我会尝试在操作数据时不更改$ sheet,而是创建一个可以容纳所有数据的新数组。像这样:
$sheet = Import-Csv data.csv
$newsheet = @()
foreach ($line in $sheet)
{
if ($line.'Support Started' -cmatch ",")
{
$a = $line.'Support Started'.Split(",")
ForEach ($subver in $a)
{
$line2 = $line.PSObject.Copy()
$line2.'Support Started' = $subver
$newsheet += $line2
}
} else {
$newsheet += $line
}
}
答案 1 :(得分:0)
你的行
$sheet = $sheet += ($line)
应该阅读(编辑)
$sheet += @{'product'=$line.product; 'status'=$line.status; 'support started'=$_}
当$ line来自$ sheet时,PS会稍微混淆,通过制作新对象来补救
答案 2 :(得分:0)
$sheet = $sheet += ($line)
$sheet += $line
已将$line
追加到$sheet
。额外的分配操作可能会导致您的问题。
答案 3 :(得分:0)
未经测试:
$sheet =
foreach ($line in $sheet)
{
if ($line.'Support Started' -cmatch ",")
{
$line.'Support Started'.Split(",") |
ForEach
{
$subver = $_
$line.'Support Started' = $subver
$line
}
}
else {$line}
}