只获取文本文件的一部分

时间:2015-03-27 17:12:52

标签: vb.net

我正在构建一个VB Parser,我必须将VB类解析为文件。

现在我正在这样做:

Dim lines As List(Of String) = File.ReadAllLines(fileName).ToList()

其中fileName是要解析的vb类文件的实际路径。但是我主要担心的是它实际上会获取文件中的所有行。

所以说我有一个看起来像这样的vb.class:

Public Class Class1VB


    Friend item1 As String
    Friend item2 As String
    Friend item3 As String
    Friend item4 As String
    Friend item5 As String
    Friend item6 As String

    Public Sub New()
        MyBase.new()
    End Sub

    Public Overrides Sub InstanciateVariables()

        item1 = New String()
        item2 = New String()
        item3 = New String()
        item4 = New String()
        item5 = New String()
        item6 = New String()

    End Sub

End Class

#End Region

我只想要位于InstanciateVariables()数组lines Sub中的项目,有没有办法使用Linq或任何可用的VB逻辑?

3 个答案:

答案 0 :(得分:1)

你的文件有多长?如果它们不是很大,您可以将整个文件的内容加载到单个字符串中,然后使用String.IndexOf()来标识字符串中的位置,其中" InstanciateVariables()"代码出现。接下来,找到" End sub"的后续位置。出现然后执行string.substring()操作以提取所需内容。

答案 1 :(得分:1)

你可以1)将整个列表放入ListOfAllLines,2)循环,逐个读取每一行,直到你到达循环中的“InstanceVariables”,3),从ListOfAllLines复制到ListOfImportantLines直到你得到“End Sub”,4)停止阅读ListOfAllLines并删除它。

答案 2 :(得分:1)

如果您使用File.ReadLines()而不是File.ReadAllLines(),则会获得IEnumerable(Of String),您可以使用Linq查询,同时读取所需的最小行数。例如这将获得InstanciateVariables内容,没有SubEnd Sub行,并且只能读取End Sub行。

Dim lines = File.ReadLines(fileName)
Dim selectedLines = lines.
    SkipWhile(Function(x) Not x.Contains("InstanciateVariables()")).
    Skip(1).
    TakeWhile(Function(x) Not x.Contains("End Sub"))
For Each l In selectedLines
    Console.WriteLine(l)
Next

它仍然必须阅读Public Overrides Sub InstanciateVariables()行之前的所有行 - 我不知道有什么方法可以避免这种情况。

如果你想要SubEnd Sub行更麻烦,但你可以创建一个扩展方法来包含线:

<Extension>
Public Iterator Function TakeUntilInclusive(Of T)(data As IEnumerable(Of T), predicate As Func(Of T, Boolean)) As IEnumerable(Of T)
    For Each item In data
        Yield item
        If predicate(item) Then
            Return
        End If
    Next
End Function

然后使用:

Dim lines = File.ReadLines(fileName)
Dim selectedLines = lines.
    SkipWhile(Function(x) Not x.Contains("InstanciateVariables()")).
    TakeUntilInclusive(Function(x) x.Contains("End Sub"))
For Each l In selectedLines
    Console.WriteLine(l)
Next