gpt4 book ai didi

ruby - 使用正则表达式找到一个字符串,然后使用正则表达式找到一个新的字符串来替换它

转载 作者:太空宇宙 更新时间:2023-11-03 17:36:42 26 4
gpt4 key购买 nike

我使用 BatchGeo 从电子表格创建 map ,然后下载 KML 数据,即:

<Placemark>
<name>?</name>
<Snippet></Snippet>
<description><![CDATA[]]></description>
<styleUrl>#style75</styleUrl>
<address>1234 Example St Denver, CO 80221</address>
<Point>
<coordinates>-121.879364,37.815151,0.000000</coordinates>
</Point>
</Placemark>

当导入回 Google map 时,点被放置在正确的地址/坐标处,但左侧边栏上每个图钉旁边的名称/描述符只显示“?”而不是显示地址。

我想使用正则表达式来查找每个 "<name>?</name>" ,然后使用正则表达式查找 <address>.*</address> 的下一个实例在文件中,然后返回并替换 ?<name> 之间带有 * 的标签那是在 <address> 之间标签。

<Placemark>之间有一段代码每个点都有标签,总共有数百个点。

这是我到目前为止的点点滴滴:

newkml = File.open( 'Newkml.txt', 'w' )

def process_line(x)
unless x == "<name>?</name>"
# just return the original line
else
# Find the next instance of /<address>(.*)<\/address>/
# Go to the original line
# Replace it with "<name>#{$1}</name>"
end
end

File.foreach('Whatever.kml'){|line|} do line.process_line
# Make a new file, copy over all of the lines that aren't <name>?</name>,
# and fix the name lines using the method above

更新:在原始服务 (BatchGeo) 中,有一个选项可以设置哪些信息包含在哪些 KML(XML) 标签中,因此我创建了一个新 map 并首先防止了问题的发生。感谢那些向我推荐我将来可以用于此类操作的工具的人。

更新 2:尝试 Mark Thomas 的解决方案。这是我运行的代码:

require 'rubygems'
require 'nokogiri'

doc = Nokogiri::XML("whatever.xml")

edits = 0

doc.xpath("//name").each do |name|
if name.content == "?"
name.content = name.xpath("following-sibling::address").text
edits +=1
end
end

puts( doc.inspect )
puts( "edits: #{edits}" )
puts doc

这给了我以下输出:

#<Nokogiri::XML::Document:0xfe0064 name="document>
edits: 0
<?xml version="1.0"?>

如果edits我添加的测试代码按我认为的方式工作,它似乎表明 if name.content == "?" block 执行了 0 次(比我预期的少了大约 130 次)。

最佳答案

已经为您完成了解析/生成几乎任何语言的 KML 文件的工作。我怀疑这个对你有用:https://github.com/schleyfox/ruby_kml

更新

由于没有实际使用过上述库,我想确认我的建议 - 看起来所有的辅助函数都用于创建 KML 文件,但仍然需要您使用 XML 解析器来加载一个。我仍然建议这比仅按照建议使用 XML 解析器来操作 KML 更好(尽管这肯定也能正常工作),但您可能还想看看 http://georuby.rubyforge.org/georuby-doc/index.html它支持 KML 输入和输出。

更新 2 - 为后代添加。

在我的回答中多加考虑,我对此类问题的默认建议是:

  1. 将 KML 解析为对象
  2. 改正错误
  3. 重新生成 KML

我的理由是这应该不太容易破坏输出,如果您最终开始对 KML 进行更多操作,那么您已经完成了 90%。

所有这一切都表明,在您的特定情况下,为了仅对已知数据进行您确定的更改,@Mark Thomas 的方法将提供更快且代码开销更低的解决方案。

关于ruby - 使用正则表达式找到一个字符串,然后使用正则表达式找到一个新的字符串来替换它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14370790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com