PowerShell实现正则匹配结果分两列导出CSV的问题求解
问题根因
原代码无法分列存储的核心问题有3个:
- 逐行独立匹配正则,没有按JIL的作业块边界做字段配对,所有匹配到的insert_job、machine值是按行顺序平铺的线性列表,没有绑定到同一个作业对象上
- 直接用
Add-Content写入纯文本,没有生成结构化的两列对象,CSV写入逻辑无法识别列边界 - 正则规则没有覆盖作业名、主机名可能存在的数字、特殊字符场景,容易漏匹配
修正后实现代码
采用逐行遍历+状态记录的方式,按作业块归集字段,最终通过标准CSV导出命令生成两列文件,不会出现错位:
# 配置文件路径 $inputPath = "D:\Users\naham1224\Desktop\jil.txt" $outputPath = Join-Path $env:USERPROFILE "Desktop\jil2.csv" # 初始化结果集合和当前作业对象 $jobList = [System.Collections.Generic.List[PSObject]]::new() $currentJob = $null # 逐行遍历JIL文件 Get-Content -Path $inputPath | ForEach-Object { $line = $_.Trim() # 匹配到新作业的起始标记 if ($line -match '^insert_job:\s*(\S+)') { # 之前已有未保存的作业,先加入结果集 if ($null -ne $currentJob) { $jobList.Add($currentJob) } # 初始化新作业对象 $currentJob = [PSCustomObject]@{ insert_job = $matches[1] machine = $null } } # 匹配到当前作业的machine字段 elseif ($null -ne $currentJob -and $line -match '^machine:\s*(\S+)') { $currentJob.machine = $matches[1] } } # 把文件末尾最后一个作业加入结果集 if ($null -ne $currentJob) { $jobList.Add($currentJob) } # 导出为标准两列CSV,UTF8编码兼容Excel $jobList | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8
使用说明
- 导出的CSV第一列为
insert_job(作业名),第二列为machine(运行主机) - 逻辑自动适配作业块内字段顺序变化、个别作业缺失machine字段的场景,不会出现跨作业字段错位
- 如果你的JIL配置中作业名、主机名包含空格等特殊字符,可以对应调整正则里的捕获规则即可
内容的提问来源于stack exchange,提问作者Ahamed
相关产品推荐
相关产品推荐

