LyessD
LyessD

Reputation: 221

How to use substring() function to get middle string with relative index?

I want to extract characters from a string. However, the string doesn't have the same length every time.

Basically I get data from a database and I want extract the value I need in it. But I'm stuck on step where I have to extract the right value.

So first I get data like that :

 infoDataset2 = accessRequet_odbc("select st_astext(st_snaptogrid(geom, 0.01)) from netgeo_point_tech", myConnection)

The result is something like : POINT(921021.98 6671778.45). What I need are the 2 figures, but their length is not fixed. I just want to remove POINT( and ).

Then I work on each line of the DataSet I get to cast each lines into a string with only the value needed.

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

This was my last try, where I was able to remove POINT( but I'm struggling with the length to cut ).

I want to learn from this, so, if possible, explain to me what I'm doing wrong here, or if my approach is lacking insight.

Upvotes: 0

Views: 1613

Answers (3)

Andrew Morton
Andrew Morton

Reputation: 25023

It will be horrible to debug that one long line. It makes no difference to the computer if you split it up into easy-readable parts. Here's some code to get the x- and y-coordinates from a string formatted as shown in the question:

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))

Another way of parsing the string is to use a regular expression, which can be more flexible. In this example, I used named capture groups to make it easy to see which parts are for the x and 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

Upvotes: 2

RobertBaron
RobertBaron

Reputation: 2854

Here is an even probably easier to understand solution:

Dim s as String = "POINT(921021.98 6671778.45)"
Dim coordinate() as String = s.Replace("POINT(", "").Replace(")", "").Split(" ") 

Enjoy!

Upvotes: 0

OctaCode
OctaCode

Reputation: 645

Andrew Morton has given a nice answer, i upvoted that one, if you need an even easier way and that was still complicated use this

    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)

Upvotes: 1

Related Questions