如何用Regex/Python将专有配置文件解析为CSV?
解决方案汇总
一、PowerShell脚本方案(推荐,适合定期自动化)
PowerShell可直接读取文件并解析内容,无需额外环境,支持定时任务自动化,完全匹配你的权限环境。
脚本代码
# 配置文件路径,替换为实际路径 $configPath = "C:\Your\Config\Path\ptube_config.txt" # 输出CSV路径,替换为实际路径 $outputPath = "C:\Your\Output\Path\cycles_data.csv" # 初始化变量 $currentItem = $null $cyclesValue = $null $results = @() # 逐行读取并解析文件 Get-Content $configPath | ForEach-Object { $line = $_.Trim() # 跳过注释行 if ($line -match '^//') { return } # 匹配项名称(格式:ItemName {) if ($line -match '^(\w+)\s*{') { # 保存上一个带cycles的项 if ($currentItem -and $cyclesValue) { $results += [PSCustomObject]@{ ItemName = $currentItem Cycles = $cyclesValue } } # 重置当前项和cycles值 $currentItem = $matches[1] $cyclesValue = $null return } # 匹配cycles字段(格式:cycles= 12345;) if ($line -match '^cycles\s*=\s*(\d+)\s*;') { $cyclesValue = [int]$matches[1] } } # 处理最后一个项 if ($currentItem -and $cyclesValue) { $results += [PSCustomObject]@{ ItemName = $currentItem Cycles = $cyclesValue } } # 导出为标准CSV(若要生成示例中的纯文本格式,替换为下方注释的命令) $results | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8 # 纯文本格式导出命令: # $results | ForEach-Object { "$($_.ItemName), $($_.Cycles)" } | Out-File $outputPath -Encoding UTF8
使用说明
- 修改脚本中的路径为实际文件路径
- 运行脚本:打开PowerShell,执行
.\ParseConfig.ps1 - 定期自动化:
- 通过Windows任务计划创建定时任务,直接调用该脚本
- 或在Power Automate中配置云流,通过本地网关触发脚本执行
二、Python脚本方案(适合学习,可集成VS2022)
Python语法简洁,适合文本解析场景,VS2022提供完善的Python开发环境,可边学边用。
脚本代码
import re # 配置文件路径,替换为实际路径 config_path = r"C:\Your\Config\Path\ptube_config.txt" # 输出文件路径,替换为实际路径 output_path = r"C:\Your\Output\Path\cycles_data.csv" # 正则表达式匹配规则 item_pattern = re.compile(r'^(\w+)\s*{') cycles_pattern = re.compile(r'^cycles\s*=\s*(\d+)\s*;') current_item = None cycles_value = None results = [] # 读取并解析文件 with open(config_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() # 跳过注释行 if line.startswith('//'): continue # 匹配项名称 item_match = item_pattern.match(line) if item_match: # 保存上一个带cycles的项 if current_item and cycles_value: results.append(f"{current_item}, {cycles_value}") current_item = item_match.group(1) cycles_value = None continue # 匹配cycles值 cycles_match = cycles_pattern.match(line) if cycles_match: cycles_value = cycles_match.group(1) # 处理最后一个项 if current_item and cycles_value: results.append(f"{current_item}, {cycles_value}") # 写入输出文件 with open(output_path, 'w', encoding='utf-8') as f: f.write('\n'.join(results))
使用说明
- 在VS2022中创建Python项目,粘贴代码并修改路径
- 直接运行脚本生成结果
- 定期运行:可将脚本打包为exe,通过Windows任务计划定时触发
三、Power Automate + Excel低代码方案(无需编程,适配Power Platform技能)
利用Power Automate的文本处理能力,结合Excel完成解析,完全适配你熟悉的Power Platform生态。
步骤:
- 上传配置文件到SharePoint文档库:将配置文件上传至指定库,方便Power Automate访问
- 创建Power Automate云流:
- 触发条件:选择定时触发(如每日一次)或文件更新触发
- 核心动作:
获取文件内容:读取配置文件的文本内容拆分文本:按换行符\n拆分所有行应用到每一个:遍历每一行- 跳过注释行:添加条件判断,若行以
//开头则跳过 - 匹配项名称:用
正则表达式匹配动作,匹配规则^(\w+)\s*{,提取项名称并保存到变量CurrentItem - 匹配cycles值:用
正则表达式匹配动作,匹配规则^cycles\s*=\s*(\d+)\s*;,提取数值并保存到变量CurrentCycles - 检测到新项时,若
CurrentItem和CurrentCycles均不为空,将这对值添加到数组变量Results
- 跳过注释行:添加条件判断,若行以
- 循环结束后,将剩余的有效项值添加到
Results 创建CSV表:将Results数组转换为CSV格式创建文件:将CSV保存到SharePoint文档库或OneDrive
- 导入到目标系统:直接将CSV导入Excel,或在流中添加
添加行到SharePoint列表动作,批量写入数据
四、SQL Server方案(适配SQL技能背景)
利用SQL Server的文本导入和字符串函数完成解析,适合熟悉SQL的场景。
步骤:
- 导入配置文件到临时表:
- 使用SSMS的
导入数据向导,将文本文件导入临时表#ConfigLines,每行作为一条记录
- 使用SSMS的
- 编写SQL查询解析数据:
WITH LineData AS ( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS LineNum, LTRIM(RTRIM(LineContent)) AS LineContent FROM #ConfigLines WHERE LineContent NOT LIKE '//%' -- 过滤注释行 ), ItemBlocks AS ( SELECT LineNum AS StartLine, LEAD(LineNum) OVER (ORDER BY LineNum) - 1 AS EndLine, SUBSTRING(LineContent, 1, CHARINDEX(' ', LineContent) - 1) AS ItemName FROM LineData WHERE LineContent LIKE '%{' ), CycleValues AS ( SELECT ib.ItemName, SUBSTRING(ld.LineContent, CHARINDEX('=', ld.LineContent) + 1, CHARINDEX(';', ld.LineContent) - CHARINDEX('=', ld.LineContent) - 1) AS Cycles FROM ItemBlocks ib JOIN LineData ld ON ld.LineNum BETWEEN ib.StartLine AND ib.EndLine WHERE ld.LineContent LIKE 'cycles=%' ) SELECT ItemName, Cycles FROM CycleValues
- 导出结果:右键查询结果集 -> 保存结果为 -> 选择CSV格式
- 定期运行:将导入和查询步骤封装为SQL作业,通过SQL Server代理定时执行
内容的提问来源于stack exchange,提问作者Griffin W
相关产品推荐
相关产品推荐

