まず、データを表すクラスを作成します。
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
どうやら、セパレータはタブ文字ではなく、すべてスペースです。何か案は?
次に、データ行が同じインデックスを使用しているため、ヘッダー行から取得できる二重空白インデックスを「分割」できます。
テキスト内の特定の区切り文字列のすべてのインデックスを取得するために、次の拡張メソッドを作成しました。
<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
いませんが、アイデアが得られるはずです。