求助:编写PowerShell脚本拆分表格多值列
PowerShell 拆分表格多值列解决方案
以下是实现你需求的完整PowerShell脚本,附带步骤说明:
完整脚本
# 读取原始CSV数据(请替换为你的文件路径) $originalData = Import-Csv -Path "input.csv" # 定义需要识别的分隔符 $delimiters = ';', '/' # 筛选出包含多值的列(值含指定分隔符) $columnsToSplit = $originalData[0].PSObject.Properties.Name | Where-Object { $originalData | ForEach-Object { $_.$_ } | Where-Object { $_ -match ($delimiters -join '|') } } # 统计每个待拆分列的最大拆分数量,确定新列总数 $columnMaxSplits = @{} foreach ($col in $columnsToSplit) { $maxCount = $originalData | ForEach-Object { ($_.$col -split ($delimiters -join '|') | Where-Object { $_ -ne '' }).Count } | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum $columnMaxSplits[$col] = $maxCount } # 逐行处理数据,拆分多值列并生成新结构 $processedData = $originalData | ForEach-Object { $row = $_ $newRow = [ordered]@{} # 保留无需拆分的原始列 foreach ($col in $originalData[0].PSObject.Properties.Name) { if ($col -notin $columnsToSplit) { $newRow[$col] = $row.$col } } # 拆分多值列,填充到对应序号列 foreach ($col in $columnsToSplit) { $splitValues = ($row.$col -split ($delimiters -join '|') | Where-Object { $_ -ne '' }) for ($i = 1; $i -le $columnMaxSplits[$col]; $i++) { $newColumnName = "$col$i" $newRow[$newColumnName] = if ($i -le $splitValues.Count) { $splitValues[$i-1] } else { '' } } } [PSCustomObject]$newRow } # 导出结果到新CSV,同时在控制台显示 $processedData | Export-Csv -Path "output.csv" -NoTypeInformation $processedData | Format-Table -AutoSize
关键步骤说明
- 读取数据:使用
Import-Csv加载原始表格数据;若你的数据是Excel文件,可先安装ImportExcel模块(执行Install-Module -Name ImportExcel),再将Import-Csv替换为Import-Excel、Export-Csv替换为Export-Excel。 - 识别待拆分列:自动遍历所有列,检查是否存在包含
;或/的行,标记这些列为需要拆分的目标列。 - 确定新列数量:统计每个待拆分列的最大非空拆分值数量,确保生成足够的序号列(比如Attribute列最多拆出5个值,就生成Attribute1到Attribute5)。
- 逐行拆分填充:对每一行先保留非拆分列,再将多值列拆分后按顺序填充到对应序号列,不足的位置填空字符串。
- 输出结果:将处理后的数据导出为新的CSV文件,同时在控制台格式化显示。
注意事项
- 脚本会自动过滤拆分后产生的空值(比如原数据中
g;h;拆分后仅保留g和h)。 - 新列顺序保持原非拆分列在前,拆分生成的序号列按原列顺序在后。
内容的提问来源于stack exchange,提问作者Kiba97
相关产品推荐
相关产品推荐

