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

如何在PowerShell中从分隔字符串构建结构化对象列表?

PowerShell解析自定义分隔字符串为结构化对象列表

需求说明

需要将格式为0||1||2||3;a||b||c||d;10||11||12||13;的字符串解析为包含var1-var4属性的结构化对象列表,支持通过foreach循环直接按属性名访问每个字段。其中:

  • 行分隔符为;
  • 单元格分隔符为||
  • 每行固定包含4个字段,行数不限

问题分析

你之前的代码将每行拆分为数组后直接存入列表,得到的是数组的数组,无法通过row.var1这种属性名方式访问。需要将每行的单元格值映射到命名属性,生成自定义对象。

解决方案

基础实现

# 原始输入字符串
$Content = "0||1||2||3;a||b||c||d;10||11||12||13;"

# 拆分出行数据并过滤空行(避免原字符串结尾的;产生空元素)
$rows = $Content -split ";" | Where-Object { $_ -ne '' }

# 初始化对象列表
$table = @()

foreach ($row in $rows) {
    # 拆分当前行的单元格
    $cells = $row -split "\|\|"
    
    # 确保每行恰好有4个单元格,避免索引越界
    if ($cells.Count -eq 4) {
        # 创建带命名属性的自定义对象
        $rowObj = [PSCustomObject]@{
            var1 = $cells[0]
            var2 = $cells[1]
            var3 = $cells[2]
            var4 = $cells[3]
        }
        $table += $rowObj
    }
}

# 遍历测试
foreach ($row in $table) {
    Write-Host "组合值:$($row.var1)$($row.var2)$($row.var3)$($row.var4)"
}

高效优化版(适合大量数据)

如果处理的行数较多,避免使用+=拼接数组(会频繁创建新数组影响性能),改用管道式生成:

$Content = "0||1||2||3;a||b||c||d;10||11||12||13;"

$table = $Content -split ";" | Where-Object { $_ -ne '' } | ForEach-Object {
    $cells = $_ -split "\|\|"
    if ($cells.Count -eq 4) {
        [PSCustomObject]@{
            var1 = $cells[0]
            var2 = $cells[1]
            var3 = $cells[2]
            var4 = $cells[3]
        }
    }
}

# 遍历测试
$table | ForEach-Object {
    Write-Host "属性访问:$($_.var1) - $($_.var2) - $($_.var3) - $($_.var4)"
}

关键说明

  • 使用[PSCustomObject]将哈希表转换为自定义对象,实现属性名直接访问
  • 增加Where-Object { $_ -ne '' }过滤拆分后产生的空行
  • 加入单元格数量判断,避免因格式错误导致的索引越界问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:10:19