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

如何用PowerShell正则拆分文件块并存入数组?

拆分文件块并存储到数组(支持多行块)

核心思路:用临时集合逐行收集分隔符之间的多行内容,遇到分隔符时将临时集合的内容存入目标数组,最后处理未被分隔符收尾的末尾块。以下提供两种常见场景的实现方案:


方案1:每个块存储为多行字符串

适合需要将块作为完整文本使用的场景,合并块内的所有行成单个字符串。

# 初始化存储所有块的数组
$blockArray = @()
# 临时存储当前块的行内容
$currentBlockLines = @()
# 定义块分隔符
$separator = "===BLOCK_END==="

# 读取目标文件内容(-Raw参数保留原始换行符)
$content = Get-Content -Path "input.txt" -Raw

# 逐行处理内容
foreach ($line in $content -split "`r?`n") {
    # 匹配分隔符(Trim()处理可能存在的前后空白)
    if ($line.Trim() -eq $separator) {
        # 若当前块有内容,合并为多行字符串后加入数组
        if ($currentBlockLines.Count -gt 0) {
            $blockArray += $currentBlockLines -join "`n"
            $currentBlockLines = @() # 重置临时集合
        }
    } else {
        # 跳过空行(可选,根据业务需求调整)
        if (-not [string]::IsNullOrWhiteSpace($line)) {
            $currentBlockLines += $line
        }
    }
}

# 处理最后一个未被分隔符收尾的块
if ($currentBlockLines.Count -gt 0) {
    $blockArray += $currentBlockLines -join "`n"
}

# 输出结果查看
$blockArray

方案2:每个块存储为行数组

适合需要保留块内每行独立结构的场景,每个块以行数组的形式存入目标数组。

$blockArray = @()
$currentBlockLines = @()
$separator = "===BLOCK_END==="

# 逐行读取文件(不使用-Raw,节省大文件内存占用)
$content = Get-Content -Path "input.txt"

foreach ($line in $content) {
    if ($line.Trim() -eq $separator) {
        if ($currentBlockLines.Count -gt 0) {
            # 逗号用于将行数组作为单个元素加入,避免被拆分为多个元素
            $blockArray += ,$currentBlockLines
            $currentBlockLines = @()
        }
    } else {
        if (-not [string]::IsNullOrWhiteSpace($line)) {
            $currentBlockLines += $line
        }
    }
}

# 处理末尾块
if ($currentBlockLines.Count -gt 0) {
    $blockArray += ,$currentBlockLines
}

# 格式化输出每个块的内容
$blockArray | ForEach-Object {
    Write-Host "`n--- 块内容分割线 ---"
    $_
}

测试示例

测试输入文件(input.txt)内容:

第一块第一行,带特殊字符:!@#$
第一块第二行
第一块第三行
===BLOCK_END===
第二块第一行
第二块第二行(空行测试)

第二块第三行
===BLOCK_END===
第三块仅一行

方案1运行结果:

$blockArray包含3个字符串元素:

  1. "第一块第一行,带特殊字符:!@#$n第一块第二行n第一块第三行"
  2. "第二块第一行n第二块第二行(空行测试)n第二块第三行"
  3. "第三块仅一行"

方案2运行结果:

$blockArray的每个元素是行数组:

  • 第一个元素:@("第一块第一行,带特殊字符:!@#$", "第一块第二行", "第一块第三行")
  • 第二个元素:@("第二块第一行", "第二块第二行(空行测试)", "第二块第三行")
  • 第三个元素:@("第三块仅一行")

关键注意事项

  • 分隔符匹配时用Trim(),避免因换行、空格导致的匹配失败
  • 必须处理末尾未被分隔符收尾的块,否则会丢失内容
  • 方案2中添加行数组到目标数组时,必须用,$currentBlockLines,否则PowerShell会将行数组的每一行拆分为单独元素存入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:45:30