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

如何匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:53:35