如何匹配CSV设备名与XML文件名并批量替换Modbus地址占位符
批量替换XML模板占位符匹配CSV数据的实现方案
需求说明
已通过批处理从VRF_ListNames.csv读取设备名称,将模板XML复制到tmp目录并命名为对应设备名的XML文件。现需遍历tmp目录下的XML文件,匹配VRF_Adress.csv第一列的设备名与XML文件名,用CSV行中的地址值替换XML内的XXNAMEXX、XXADR1XX至XXADR9XX占位符。
PowerShell实现脚本
# 加载CSV地址数据,将设备名作为键构建哈希表,提升匹配效率 $addressMap = @{} Import-Csv .\VRF_Adress.csv | ForEach-Object { # 取CSV第一列的值作为设备名,若实际列名明确可直接指定(如$_.DeviceName) $deviceName = $_.PSObject.Properties[0].Value $addressMap[$deviceName] = $_ } # 遍历tmp目录下的所有XML文件 Get-ChildItem -Path ".\tmp" -Filter "*.xml" | ForEach-Object { # 提取XML文件名(不含扩展名)作为匹配的设备名 $deviceName = $_.BaseName # 查找对应CSV行数据 if ($addressMap.ContainsKey($deviceName)) { $data = $addressMap[$deviceName] # 读取XML文件内容 $content = Get-Content -Path $_.FullName -Raw # 替换XXNAMEXX占位符 $content = $content -replace 'XXNAMEXX', $deviceName # 批量替换XXADR1XX至XXADR9XX占位符 for ($i = 1; $i -le 9; $i++) { $placeholder = "XXADR${i}XX" # 假设CSV中对应地址列名为ADR1-ADR9,若实际列名不同请修改此处 $addressValue = $data."ADR${i}" if ($addressValue) { $content = $content -replace $placeholder, $addressValue } } # 将修改后的内容写回XML文件 Set-Content -Path $_.FullName -Value $content -Encoding UTF8 Write-Host "已完成设备 $deviceName 的XML占位符替换" } else { Write-Warning "未找到设备 $deviceName 对应的CSV地址数据" } }
注意事项
- 若
VRF_Adress.csv第一列有明确列名(如DeviceName),可直接将$deviceName = $_.PSObject.Properties[0].Value改为$deviceName = $_.DeviceName,匹配更精准。 - 若CSV中地址列的命名不是
ADR1至ADR9,需调整循环内的$data."ADR${i}"部分,与实际列名保持一致。 - 脚本默认用UTF8编码保存XML,若原模板使用其他编码,可修改
Set-Content的-Encoding参数(如-Encoding Default)。
内容的提问来源于stack exchange,提问作者Juro Ozimy
相关产品推荐
相关产品推荐

