user2180718
user2180718

Reputation: 1

Get Text between characters in a string

I have a text file with a list of music that looks like this:

BeginSong{
Song Name
Artist
Genre
}EndSong

There are multiple instances of this.

I'm wanting to get the text between the BeginSong{ and }EndSong and put the song info into a string array. Then I want to add each instance to a ListBox as Artist - Song Name (that part I'm sure I can figure out though). I hope that was a clear description.

Upvotes: 0

Views: 584

Answers (3)

djv
djv

Reputation: 15774

There is a nice answer from Neolisk that uses Regular Expressions. But since you also included the VB6 tag in addition to VB.NET, I'll take a shot at a VB6 solution.

You can use the string Split function, and split on the "ends", i.e. "BeginSong{" and "}EndSong"

Dim songInfos As String
Dim firstArray() As String
Dim secondArray() As String
Dim thirdArray() As String
Dim songInfoArray() As String
Dim i As Integer
Dim songCounter As Integer
' to test:
songInfos = songInfos & "BeginSong{" & vbNewLine
songInfos = songInfos & "Song Name1" & vbNewLine
songInfos = songInfos & "Artist1" & vbNewLine
songInfos = songInfos & "Genre1" & vbNewLine
songInfos = songInfos & "}EndSong" & vbNewLine
songInfos = songInfos & "BeginSong{" & vbNewLine
songInfos = songInfos & "Song Name2" & vbNewLine
songInfos = songInfos & "Artist2" & vbNewLine
songInfos = songInfos & "Genre2" & vbNewLine
songInfos = songInfos & "}EndSong"

firstArray = Split(songInfos, "BeginSong{")

songCounter = 0

ReDim songInfoArray(2, 0)

For i = 1 To UBound(firstArray) Step 1
    secondArray = Split(firstArray(i), "}EndSong")
    thirdArray = Split(secondArray(0), vbNewLine)
    songInfoArray(0, songCounter) = thirdArray(1)
    songInfoArray(1, songCounter) = thirdArray(2)
    songInfoArray(2, songCounter) = thirdArray(3)
    songCounter = songCounter + 1
    If i < UBound(firstArray) Then
        ReDim Preserve songInfoArray(2, songCounter)
    End If
Next i

The watch after the last line. Note the structure of songInfoArray, which was required for it to be ReDimmed

enter image description here

Upvotes: 0

Victor Zakharov
Victor Zakharov

Reputation: 26424

You can use a regular expression with named groups:

BeginSong{\n(?<song_name>.*)\n(?<artist>.*)\n(?<genre>.*)\n}EndSong

Something like this:

Imports System.Text.RegularExpressions
'...
Dim s As New Regex("BeginSong{\n(?<song_name>.*)\n(?<artist>.*)\n(?<genre>.*)\n}EndSong")
Dim mc As MatchCollection = s.Matches(inputFile)
For Each m As Match In mc
  Dim song_name As String = m.Groups("song_name").Value
  Dim artist As String = m.Groups("artist").Value
  Dim genre As String = m.Groups("genre").Value
  'use or store these values as planned
Next

Upvotes: 0

Use the ReadLine() function of the FileStream

since you already know the order of the information, you should be able to loop all File Lines and store them in their corresponding properties.

Pseudo:

WHILE Reader.Read()
      Store Line in BeginSongTextVariable
      Read Next Line
      Store Line in SongNameVariable
      Read Next Line
      Store Line in ArtistNameVariable
      Read Next Line
      Store Line in GenreVariable
      Read Next Line
      Store Line in EndSongTextVariable
Add The Above Variables in List
End While

Upvotes: 1

Related Questions