2016-02-20 2 views
0

У меня есть Streamreader, который выталкивает ошибку после проверки каждой строки в файле Daycounts.txt. Это не стабильный txt-файл. Строковые строки в нем нестабильны. Количество линий постоянно увеличивается или уменьшается. Вот почему я использую диапазон от 0 до 167. НоОшибка чтения во время чтения из .txt-файла в vb.net

Вот содержание Daycounts.txt: Daycounts

Dim HourSum as integer 
    Private Sub Change() 
     Dim R As IO.StreamReader 
     R = New IO.StreamReader("Daycounts.txt") 
     Dim sum As Integer = 0 
     For p = 0 To 167 
      Dim a As String = R.ReadLine 
      If a.Substring(0, 2) <> "G." Then 
       sum += a.Substring(a.Length - 2, 2) 
      Else 

      End If 
     Next 
     HourSum = sum 
     R.Close() 
    End Sub 
+0

Использовать File.ReadAllLines вместо – Steve

+0

Как это сделать? Я также использовал это: Dim a As String = R.ReadToEnd не работает как – Macukadam

ответ

1

Если вы не знаете, сколько строк, то присутствуют в текстовом файле вы может использовать метод File.ReadAllLines для загрузки всех строк в памяти, а затем применить вашу логику

Dim HourSum As Integer 
Private Sub Change() 
    Dim lines = File.ReadAllLines("Daycounts.txt") 
    Dim sum As Integer = 0 
    For Each line In lines 
     If line.Substring(0, 2) <> "G." Then 
      sum += Convert.ToInt32(line.Substring(line.Length - 2, 2)) 
     Else 
      ....  
     End If 
    Next 
    HourSum = sum 
End Sub 

Это несколько неэффективно, потому что цикл по строкам в два раза (один читать их, и один, чтобы применить логику), но с небольшим набором строк это не должно быть большая проблема

Однако вы также можете использовать File.ReadLines, которые начнут перечисление ваших строк, не загружая их все в память. According to this question, блокировки ReadLines записывают ваш файл до конца вашего цикла чтения, поэтому, возможно, это может быть лучшим вариантом для вас, только если у вас нет чего-то внешнего для вашего кода, написанного одновременно с файлом.

Dim HourSum As Integer 
Private Sub Change() 
    Dim sum As Integer = 0 
    For Each line In File.ReadLines("Daycounts.txt") 
     If line.Substring(0, 2) <> "G." Then 
      sum += Convert.ToInt32(line.Substring(line.Length - 2, 2)) 
     Else 
      ....  
     End If 
    Next 
    HourSum = sum 
End Sub 

Кстати, обратите внимание, что я добавил преобразование в целое число против загруженной строки. В вашем коде операция суммы применяется непосредственно к строке. Это может работать только в том случае, если для вашего проекта установлено значение Option Strict. Этот параметр является очень плохой практикой, поддерживаемой для совместимости с VB6 и должен быть изменен на Option Strict On для новых проектов VB.NET.

+0

Спасибо. Это то, что я искал! – Macukadam

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