You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于列值转置CSV行列:80K行数据处理及PowerShell优化需求

问题分析

你的现有代码存在几个关键问题,导致功能不完整且性能低下:

  • 仅处理了NOTAPPLICABLE列,没有覆盖需求中要求的UNKNOWN、INSTALLED、FAILED、REBOOTREQUIRED状态列
  • 丢失了原始CSV中的核心基础列(IPAddress、DefaultIPGateway等)
  • 嵌套循环+多次where查询会反复遍历80K行数据集,直接导致40分钟的超长处理时间
解决方案

下面是优化后的PowerShell代码,既能满足所有功能需求,又能大幅提升处理速度:

# 1. 读取CSV文件(若原始CSV无列头,需用-Header指定完整列名,示例见下方注意事项)
$csvData = Import-Csv -Path "your_input_file.csv"

# 2. 定义需要保留的基础列(排除补丁名和状态列)
$baseColumns = "MachineName", "IPAddress", "DefaultIPGateway", "Domain", "Name", "USERID"

# 3. 定义需要检查的状态列(按需求筛选YES对应的状态)
$statusColumns = "UNKNOWN", "NOTAPPLICABLE", "INSTALLED", "FAILED", "REBOOTREQUIRED"

# 4. 获取所有唯一补丁名称,作为转置后的列头
$uniquePatches = $csvData.PatchName | Select-Object -Unique

# 5. 按MachineName分组(性能优化核心:一次遍历完成分组,避免重复查询)
$machineGroups = $csvData | Group-Object -Property MachineName

# 6. 逐组处理每个机器的记录
$result = foreach ($group in $machineGroups) {
    # 提取当前机器的基础信息(取组内第一条记录的基础列,假设同一MachineName的基础数据一致)
    $baseProps = [ordered]@{}
    foreach ($col in $baseColumns) {
        $baseProps[$col] = $group.Group[0].$col
    }

    # 为每个补丁匹配对应的状态值
    foreach ($patch in $uniquePatches) {
        $patchRecord = $group.Group | Where-Object { $_.PatchName -eq $patch }
        if ($patchRecord) {
            # 找到值为YES的状态列,取第一个匹配的状态名称
            $statusValue = $statusColumns | Where-Object { $patchRecord.$_ -eq "YES" } | Select-Object -First 1
            $baseProps[$patch] = $statusValue
        } else {
            # 若机器无该补丁记录,留空(可按需调整为其他默认值)
            $baseProps[$patch] = $null
        }
    }

    # 生成最终的对象
    New-Object -TypeName PSObject -Property $baseProps
}

# 7. 导出结果到新CSV文件
$result | Export-Csv -Path "your_output_file.csv" -NoTypeInformation -Encoding UTF8
关键优化与说明
  1. 分组处理:用Group-Object一次性将同一机器的所有补丁记录聚合,避免了原始代码中反复遍历全量数据的操作,处理80K行数据的时间会压缩到几分钟内。
  2. 完整状态覆盖:遍历所有指定状态列,精准捕捉值为YES的状态并保留,完全符合需求规则。
  3. 基础列保留:明确指定需要保留的基础列,确保输出结果包含所有原始核心字段。
  4. 有序字典:使用[ordered]@{}保证输出列的顺序与定义一致,避免列顺序混乱。
注意事项

如果你的原始CSV文件没有列头,需要在Import-Csv时补充列头定义,示例如下:

$csvData = Import-Csv -Path "your_input_file.csv" -Header "PatchName", "MachineName", "IPAddress", "DefaultIPGateway", "Domain", "Name", "USERID", "UNKNOWN", "NOTAPPLICABLE", "INSTALLED", "APPLICABLE", "REBOOTREQUIRED", "FAILED"

另外,代码默认同一MachineName对应的基础列(IP、网关等)数据一致,若存在不一致的情况,可根据实际需求调整基础信息的提取逻辑。

内容的提问来源于stack exchange,提问作者Rahul Trivedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:25:29