Assuming you're always skipping the first three lines, and the CSV data is always separated from the extra data by a blank line, something like this should work:
Private Function ReadCSVData(ByVal filepathname As String) As JObject
Dim result As New JObject()
Using sr As New StreamReader(filepathname)
sr.ReadLine()
sr.ReadLine()
sr.ReadLine()
Dim line As String = sr.ReadLine()
Do Until String.IsNullOrWhiteSpace(line)
Dim parts() As String = line.Split(":"c)
If parts.Length = 2 Then
result.Add(New JProperty(parts(0).Trim(), parts(1).Trim()))
End If
line = sr.ReadLine()
Loop
Using csv As New CsvReader(sr, True)
Dim fieldCount As Integer = csv.FieldCount
Dim headers() As String = csv.GetFieldHeaders()
Dim jsonData As New JArray()
Do While csv.ReadNextRecord()
Dim record As New JObject()
For i As Integer = 0 To fieldCount - 1
record.Add(New JProperty(headers(i), csv(i)))
Next
jsonData.Add(record)
Loop
result.Add(New JProperty("data", jsonData))
End Using
End Using
Return result
End Function
Output:
{
"Sensor ID": "...",
"Sensor Description": "...",
"Status": "...",
"data": [
{
"Time": "...",
"Sensor A": "...",
"Sensor B": "...",
"Sensor C": "..."
},
...
]
}