我想从字符串中提取字符。但是,字符串并非每次都具有相同的长度。
基本上,我从数据库中获取数据,并且想要提取其中需要的值。但是我陷入了必须提取正确值的步骤。
所以首先我得到这样的数据:
infoDataset2 = accessRequet_odbc("select st_astext(st_snaptogrid(geom, 0.01)) from netgeo_point_tech", myConnection)
结果类似于:POINT(921021.98 6671778.45)
。我需要的是2个数字,但是它们的长度不是固定的。我只想删除POINT(
和)
。
然后我在DataSet
的每一行上工作,将每行都转换为仅包含所需值的字符串。
For i = 0 To infoDataset2.Tables(0).Rows.Count - 1
geomPt = infoDataset2.Tables(0).Rows(i).ItemArray(0).Substring(geomPt = infoDataset2.Tables(0).Rows(i).ItemArray(0).Substring(1 + infoDataset2.Tables(0).Rows(i).ItemArray(0).LastIndexOf("(")))
Console.WriteLine(geomPt)
Next
这是我的最后一次尝试,在那里我可以移除POINT(
,但是我在削减)
的长度上苦苦挣扎。
我想从中学到东西,所以,如有可能,请向我解释我在这里做错了什么,或者我的方法缺乏见识。
答案 0 :(得分:2)
调试那条长线将是可怕的。如果将计算机分成易于阅读的部分,则对计算机没有影响。这是一些代码,可从问题所示格式的字符串中获取x和y坐标:
Dim s = "POINT(921021.98 6671778.45)"
Dim b1 = s.IndexOf("("c) + 1
Dim b2 = s.IndexOf(")"c, b1) - 1
Dim parts = s.Substring(b1, b2 - b1 + 1).Split({" "c})
Dim x As Decimal = Decimal.Parse(parts(0))
Dim y As Decimal = Decimal.Parse(parts(1))
解析字符串的另一种方法是使用regular expression,它可以更加灵活。在此示例中,我使用命名捕获组来轻松查看x和y的哪些部分:
Dim s = "POINT(921021.98 6671778.45)"
Dim x As Decimal
Dim y As Decimal
Dim re = New Regex("\((?<x>[0-9-.]+) (?<y>[0-9-.]+)\)")
Dim m = re.Match(s)
If m.Success Then
x = Decimal.Parse(m.Groups("x").Value)
y = Decimal.Parse(m.Groups("y").Value)
Else
' Could not parse point. Do something about it if required.
End If
答案 1 :(得分:1)
安德鲁·莫顿(Andrew Morton)给出了一个很好的答案,我赞成这样做,如果您需要一种更简单的方法并且使用此方法仍然很复杂
Dim s = "POINT(921021.98 6671778.45)"
Dim part1 As String = s.Remove(0, 6)
Dim part2 As String = part1.Substring(0, part1.Length - 1)
Dim split() As String = part2.Split(" ")
Dim x = split(0)
Dim y = split(1)
答案 2 :(得分:0)
这是一个甚至可能更容易理解的解决方案:
Dim s as String = "POINT(921021.98 6671778.45)"
Dim coordinate() as String = s.Replace("POINT(", "").Replace(")", "").Split(" ")
享受!