Я бы сначала создать класс, который представляет ваши данные:
Public Class DiskPartResult
Public Property Volume As String
Public Property Number As Int32
Public Property Ltr As String
Public Property Label As String
Public Property Fs As String
Public Property Type As String
Public Property SizeUnit As String
Public Property Status As String
Public Property Info As String
End Class
Теперь вы можете использовать File.ReadLines
со следующими Linq запрос, чтобы получить соответствующие строки данных:
Dim diskPartFileLines = File.ReadLines("Results.txt")
Dim dataLines = From line In diskPartFileLines
Skip While Not line.TrimStart().StartsWith("----------") Skip (1)
Take While line.TrimStart().StartsWith("Volume")
Теперь вам могут заполнять List(Of DiskPartResult)
:
Dim alldata = New List(Of DiskPartResult)
For Each line As String In dataLines
Dim columns = line.Trim().Split({vbTab}, StringSplitOptions.RemoveEmptyEntries)
If columns.Length <> 9 Then Continue For
Dim data = New DiskPartResult()
data.Volume = columns(0)
data.Number = Int32.Parse(columns(1))
data.Ltr = columns(2)
data.Label = columns(3)
data.Fs = columns(4)
data.Type = columns(5)
Dim sizeInfo = columns(6)
data.Size = Double.Parse(sizeInfo.Split()(0).Trim())
data.SizeUnit = sizeInfo.Split()(1).Trim()
data.Status = columns(7)
data.Info = columns(8)
alldata.Add(data)
Next
Если вы хотите вывести документ:
For Each dpr As DiskPartResult In alldata
Console.WriteLine("vol({0})", dpr.Volume)
Console.WriteLine(" .volnum={0}", dpr.Number)
Console.WriteLine(" .letter={0}", dpr.Ltr)
Console.WriteLine(" .label={0}", dpr.Label)
Console.WriteLine(" .type={0}", dpr.Type)
Console.WriteLine(" .size={0}", dpr.Size)
' and so on ... '
Next
, по-видимому, сепаратор не закладками характер, это все пробелы. Любые идеи?
Затем вы можете «разбить» на индексы с двойным белым пространством, которые вы можете получить из строки заголовка, потому что линии данных используют одни и те же индексы.
Я создал следующий метод расширения, чтобы получить все показатели для данного Seperator строки в тексте:
<System.Runtime.CompilerServices.Extension()> _
Public Function AllIndexOf(text As String, str As String, comparisonType As StringComparison) As IList(Of Integer)
Dim allIndeces As IList(Of Integer) = New List(Of Integer)()
Dim index As Integer = text.IndexOf(str, comparisonType)
While index <> -1
allIndeces.Add(index)
index = text.IndexOf(str, index + str.Length, comparisonType)
End While
Return allIndeces
End Function
Теперь вы можете использовать этот код для запроса необходимые данные:
Dim diskPartFileLines = File.ReadAllLines("Results.txt")
Dim headerLine = (From line In diskPartFileLines
Skip While Not line.TrimStart().StartsWith("----------")).First().Trim()
Dim colStartIndices As IList(Of Int32) = headerLine.AllIndexOf(" ", StringComparison.OrdinalIgnoreCase)
Dim dataLines = From line In diskPartFileLines
Skip While Not line.TrimStart().StartsWith("----------") Skip 1
Take While line.TrimStart().StartsWith("Volume")
Select line.Trim()
Dim alldata = New List(Of DiskPartResult)
Тогда перечислите запрос, инициализируйте DiskPartResults
и добавьте их в список:
For Each line In dataLines
Dim data = New DiskPartResult()
Dim lastIndex = 0
For i As Int32 = 0 To colStartIndices.Count - 1
Dim index = colStartIndices(i)
Select Case i
Case 0
data.Volume = line.Substring(lastIndex, index - lastIndex).Trim()
Case 1
data.Number = Int32.Parse(line.Substring(lastIndex, index - lastIndex).Trim())
Case 2
data.Ltr = line.Substring(lastIndex, index - lastIndex).Trim()
Case 3
data.Label = line.Substring(lastIndex, index - lastIndex).Trim()
Case 4
data.Fs = line.Substring(lastIndex, index - lastIndex).Trim()
Case 5
data.Type = line.Substring(lastIndex, index - lastIndex).Trim()
Case 6
Dim sizeInfo = line.Substring(lastIndex, index - lastIndex).Trim()
data.Size = Double.Parse(sizeInfo.Split()(0).Trim())
data.SizeUnit = sizeInfo.Split()(1).Trim()
Case 7
data.Status = line.Substring(lastIndex, index - lastIndex).Trim()
Case 8
data.Info = line.Substring(lastIndex, index - lastIndex).Trim()
End Select
lastIndex = index
Next
Next
Обратите внимание, что For Each
не проверен, но он должен дать вам эту идею.
Является ли техническая причина «Мне нужно, чтобы мой код был хрупким, если они когда-либо меняли выходной формат' d iskpart' "? –