PowerShell处理CSV单元格多行数据:简化不定行数的匹配拆分
适配CSV单元格内不定数量值的PowerShell解决方案
你现在的代码是硬编码了固定数量的变量来处理拆分后的值,这确实没法适配数量变化的情况。咱们可以通过动态遍历索引的方式来解决,完全不需要创建单个的$NodeName1、$NodeAddress1这类变量,直接根据拆分后的数组长度来循环处理就行。
核心思路
- 导入CSV后,遍历每一行有效数据(跳过空行)
- 把每个字段的值拆分成数组(这里先沿用你代码里的换行拆分逻辑,要是实际数据是空格分隔,后面会补充调整方式)
- 因为每行的三个字段拆分后的数组长度一致,所以基于其中一个数组的长度循环,每次取对应索引的三个值进行处理
优化后的代码
$csvImportFull = Import-CSV .\CSVFile.csv foreach ($row in $csvImportFull) { # 跳过空行,避免处理无效数据 if ([string]::IsNullOrWhiteSpace($row.NodeName) -and [string]::IsNullOrWhiteSpace($row.NodeAddress) -and [string]::IsNullOrWhiteSpace($row.NodeAddressDR)) { continue } # 拆分每个字段为数组,同时过滤掉空值 $nodeNames = $row.NodeName -split "\n" | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } $nodeAddresses = $row.NodeAddress -split "\n" | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } $nodeAddressesDR = $row.NodeAddressDR -split "\n" | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } # 动态遍历索引,处理每一组对应的值 for ($i = 0; $i -lt $nodeNames.Count; $i++) { $currentName = $nodeNames[$i].Trim() $currentAddr = $nodeAddresses[$i].Trim() $currentAddrDR = $nodeAddressesDR[$i].Trim() Write-Host "$currentName $currentAddr" Write-Host "$currentName $currentAddrDR" } }
额外说明
如果你的CSV单元格里的多个值是用空格分隔(比如原始示例里的"1.com 2.com 3.com 4.com"),那把代码里的-split "\n"改成-split "\s+"(匹配一个或多个空格)会更准确,能正确拆分多个空格分隔的内容,同时自动过滤掉多余的空白。
内容的提问来源于stack exchange,提问作者Paul Dawson
相关产品推荐
相关产品推荐

