PowerShell实现KML数据转指定格式CSV的需求与问题
处理KML数据生成关联名称的CSV脚本方案
-replace命令没法实现这种带状态跟踪的替换逻辑,因为它只能做静态字符串替换,没法在处理过程中保存并复用动态更新的名称变量。直接用逐行处理的方式更靠谱,以下是PowerShell实现脚本:
# 初始化变量:当前关联名称、CSV内容(先写入表头) $currentName = $null $csvContent = @("X,Y,Name") # 读取源数据文件(替换为你的实际文件路径) Get-Content -Path "your_input_file.txt" | ForEach-Object { $trimmedLine = $_.Trim() # 匹配<kml:name>标签,提取名称并更新当前变量 if ($trimmedLine -match '<kml:name>(.*?)</kml:name>') { $currentName = $matches[1] } # 匹配坐标行(假设格式为 经度,纬度,可根据实际结构调整正则) elseif ($trimmedLine -match '^(-?\d+\.\d+),(-?\d+\.\d+)$') { # 提取经度(X)、纬度(Y),关联当前名称生成CSV行 if ($currentName) { $csvContent += "$($matches[1]),$($matches[2]),$currentName" } } } # 将结果写入CSV文件(替换为你的输出路径) $csvContent | Out-File -Path "output.csv" -Encoding UTF8
关键说明:
- 状态跟踪:通过
$currentName变量持续记录最近一次匹配到的名称,后续所有坐标行都会关联这个名称,直到遇到下一个<kml:name>标签更新变量。 - 正则适配:如果你的坐标行包含KML的
<coordinates>标签或海拔值,比如<coordinates>116.397,39.908,0</coordinates>,把坐标匹配的正则改成:elseif ($trimmedLine -match '<coordinates>(-?\d+\.\d+),(-?\d+\.\d+),.*?</coordinates>') - 编码处理:用
-Encoding UTF8确保中文名称不会乱码。
内容的提问来源于stack exchange,提问作者Rubric23
相关产品推荐
相关产品推荐

