Take a look at your input string (has been changed into rows in helping analyze process):
Application: ws_cp_ixnsrv_mm DBID: 845 Status: APP_STATUS_STOPPED Runmode: EXITED
Application: mng_dbserver_p DBID: 469 Status: APP_STATUS_RUNNING Runmode: PRIMARY
Application: ird_dap DBID: 470 Status: APP_STATUS_UNKNOWN Runmode: EXITED
Application: mng_dap DBID: 471 Status: APP_STATUS_UNKNOWN Runmode: EXITED
Application: mng_messagesrv_p DBID: 472 Status: APP_STATUS_RUNNING Runmode: PRIMARY
Application: mng_scs_p DBID: 473 Status: EXITED Error <- incomplete data: does NOT contain [APP_STATUS] header!!!
Application: pulse_collector_02 DBID: 827 Status: APP_STATUS_RUNNING Runmode: BACKUP
Application: was_tomcat_1 DBID: 829 Status: APP_STATUS_RUNNING Runmode: PRIMARY
Application: svc_nss_p DBID: 850 Status: APP_STATUS_RUNNING Runmode: PRIMARY
Application: svc_nss_b DBID: 851 Status: APP_STATUS_STOPPED Runmode: EXITED Error
If every "record" would have the same number of headers, it would be very easy to split data:
Dim inputString As String = "Application: ws_cp_ixnsrv_mm DBID: 845 Status: APP_STATUS_STOPPED Runmode: EXITED Application: mng_dbserver_p DBID: 469 Status: APP_STATUS_RUNNING Runmode: PRIMARY Application: ird_dap DBID: 470 Status: APP_STATUS_UNKNOWN Runmode: EXITED Application: mng_dap DBID: 471 Status: APP_STATUS_UNKNOWN Runmode: EXITED Application: mng_messagesrv_p DBID: 472 Status: APP_STATUS_RUNNING Runmode: PRIMARY Application: mng_scs_p DBID: 473 Status: EXITED Error Application: pulse_collector_02 DBID: 827 Status: APP_STATUS_RUNNING Runmode: BACKUP Application: was_tomcat_1 DBID: 829 Status: APP_STATUS_RUNNING Runmode: PRIMARY Application: svc_nss_p DBID: 850 Status: APP_STATUS_RUNNING Runmode: PRIMARY Application: svc_nss_b DBID: 851 Status: APP_STATUS_STOPPED Runmode: EXITED Error"
Dim cols As String() = {"Application: ", "DBID: ", "Status: ", "Runmode: "}
Dim result = initialString.Split(cols, StringSplitOptions.RemoveEmptyEntries)
As an
inputString
does contain incomplete data, you need to write custom method, for eaxmple:
Dim dt As DataTable = New DataTable()
Dim cols As String() = {"Application: ", "DBID: ", "Status: ", "Runmode: "}
dt.Columns.AddRange(cols.Select(Function(c) New DataCOlumn(c.Replace(": ", ""), Type.GetType("System.String"))).ToArray())
Dim inputString As String = "Application: ws_cp_ixnsrv_mm DBID: 845 Status: APP_STATUS_STOPPED Runmode: EXITED Application: mng_dbserver_p DBID: 469 Status: APP_STATUS_RUNNING Runmode: PRIMARY Application: ird_dap DBID: 470 Status: APP_STATUS_UNKNOWN Runmode: EXITED Application: mng_dap DBID: 471 Status: APP_STATUS_UNKNOWN Runmode: EXITED Application: mng_messagesrv_p DBID: 472 Status: APP_STATUS_RUNNING Runmode: PRIMARY Application: mng_scs_p DBID: 473 Status: EXITED Error Application: pulse_collector_02 DBID: 827 Status: APP_STATUS_RUNNING Runmode: BACKUP Application: was_tomcat_1 DBID: 829 Status: APP_STATUS_RUNNING Runmode: PRIMARY Application: svc_nss_p DBID: 850 Status: APP_STATUS_RUNNING Runmode: PRIMARY Application: svc_nss_b DBID: 851 Status: APP_STATUS_STOPPED Runmode: EXITED Error"
Dim records = inputString.Split(New String(){"Application: "}, StringSplitOptions.RemoveEmptyEntries) _
.Select(Function(a) String.Concat("Application: ", a).Split(cols, StringSplitOptions.RemoveEmptyEntries)) _
.ToList()
Dim r As Regex = New Regex("\d{3,}")
Dim j As Integer = 0
For Each parts As String() In records
Dim dr As DataRow = dt.NewRow()
For i As Integer = 0 To parts.Length -1
If parts(i).ToLower().Equals(parts(i), StringComparison.Ordinal) And parts(i).Contains("_") Then
j = 0
Else
If parts(i).ToUpper().Equals(parts(i), StringComparison.Ordinal) And parts(i).Contains("_") Then
j = 2
Else
If r.IsMatch(parts(i)) Then
j = 1
Else
j = 3
End If
End If
End If
dr(j) = parts(i)
Next i
dt.Rows.Add(dr)
Next parts
DataGridView1.DataSource = dt