2015-03-27 2 views
-1

Я создаю 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() Sub в lines массиве, есть способ сделать это с помощью Linq или любой доступной логики VB?

+0

Вы объявляете varibles как 'String', но инициализировать их как массив строк? В любом случае, вы должны инициализировать свой список, используя ключевое слово 'New'. Но где ваша проблема? – Eminem

+0

Ну, я получаю весь документ в списке, и мой вопрос заключается в том, есть ли способ получить только то, что я ищу. – hsim

+0

У всех файлов кода есть флаг, который говорит «InstanceVariables», или это просто пример? – CindyH

ответ

1

Если вы используете File.ReadLines() вместо File.ReadAllLines(), вы получаете IEnumerable(Of String), который вы можете использовать Linq для запроса, при чтении минимального количества линий, необходимых. например Это получило бы содержание от InstanciateVariables, без линий Sub и End 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() линии - я не знаю ни одного способа, чтобы избежать этого.

Если вы хотите Sub и End 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 
+0

Нет необходимости получать значения 'Sub' и' End Sub'. У тебя есть именно то, что я искал, спасибо! – hsim

1

Сколько времени у вас есть? Если они не огромны, вы можете загрузить содержимое всего файла в одну строку, а затем использовать String.IndexOf(), чтобы определить местоположение внутри строки, где появляется код «InstanciateVariables()». Затем найдите последующее место, где появится «End sub», а затем выполните операцию string.substring(), чтобы вытащить нужное содержимое.

+0

Длина файлов зависит от класса для разбора. Однако структура остается прежней, и, как упоминалось выше, она всегда будет содержать подменю «InstantiateVariables», которая является целевой. – hsim

+0

Они, вероятно, не превышают максимальный размер строки (что, насколько я понимаю, довольно велико). Дайте ему шанс и посмотрите, работает ли это. – ChicagoMike

1

Вы можете 1) получить весь список в ListOfAllLines, 2) в цикле, прочитать каждую строку один за другим, пока не получите тот, который говорит «InstanceVariables», 3) в цикле, скопируйте из ListOfAllLines в ListOfImportantLines пока вы не дойдете до «End Sub», 4) прекратите чтение ListOfAllLines и удалите его.

Смежные вопросы