2013-06-25 3 views
0

У меня есть файл csv, и мне нужно получить последнюю строку только в отдельные текстовые поля.Импорт последней строки файла .csv

Imports System.IO 

Public Class Form1 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    End Sub 

    Private Sub btnConditions_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConditions.Click 
     Using reader As New StreamReader("C:\temp\Apr12log.txt") 
      Dim line As String = reader.ReadLine() 


      Dim fields() As String = line.Split(",".ToCharArray()) 
      Dim fileDate = CDate(fields(0)) 
      Dim fileTime = fields(1) 
      Dim fileTemp = fields(2) 
      Dim fileHum = fields(3) 
      Dim fileWindSpeed = fields(4) 
      Dim fileWindGust = fields(5) 
      Dim fileWindBearing = fields(6) 

      While line IsNot Nothing 

       line = reader.ReadLine() 
      End While 
      txtDate.Text = CStr(fileDate) 
     End Using 

    End Sub 

End Class 

Он вводит только первую строку. Я не уверен, как получить только последнюю строку.

пример txtfile

01/04/12,00:00,5.4,80,3.0,4.5,9.6,261,0.0,0.0,1025.0,1.0,16.8,43,4.0,3.8,5.4,0.0,0,0.0 
+0

Является ли файл .csv достаточно маленьким, чтобы его можно было считывать в память за один раз, или это огромный файл? –

+0

Это небольшой файл около 30 строк. – yolad

+0

Хотя в C#, [this] (http://stackoverflow.com/questions/11625595/read-last-line-of-text-file) отвечает на то, что вы ищете. – shahkalpesh

ответ

3

В качестве альтернативы вы можете использовать функцию System.IO.File ReadLines(), которая дает вам перечислимое имя, которое вы можете назвать Last().

Private Sub btnConditions_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConditions.Click 

     Dim line As String = System.IO.File.ReadLines("C:\temp\Apr12log.txt").Last() 

     Dim fields() As String = line.Split(",".ToCharArray()) 
     Dim fileDate = CDate(fields(0)) 
     Dim fileTime = fields(1) 
     Dim fileTemp = fields(2) 
     Dim fileHum = fields(3) 
     Dim fileWindSpeed = fields(4) 
     Dim fileWindGust = fields(5) 
     Dim fileWindBearing = fields(6) 

     txtDate.Text = CStr(fileDate) 

End Sub 
+0

Работы просто спасибо! – yolad

+0

Рассмотрите [правильность ответа на вопрос] (http://meta.stackexchange.com/a/5235/208536) и выполните ответ, если это поможет вам – SysDragon

0

Попробуйте это:

Dim lines() As String = File.ReadAllLines("C:\temp\Apr12log.txt") 

lastLine = lines(lines.Length - 1) 
1

Вы только чтение в одной строке. Вместо того, чтобы использовать ReadToEnd(), а затем разделить на новую строку, например, так:

Dim lines() As String = reader.ReadToEnd().Split(Environment.NewLine) 

Затем вы можете перейти к последней строке:

Dim line As String = lines(lines.Length - 1) 
1

Вы можете получить то, что вы хотите с парой правок к существующему коду:

Сдвиг

While line IsNot Nothing 

     line = reader.ReadLine() 
    End While 

чтобы сразу после

Dim line As String = reader.ReadLine() 

Добавить еще

Dim line2 As String = Nothing 

И вставить

 line2 = line 

В петле While, т.е.

While line IsNot Nothing 
     line2 = line 
     line = reader.ReadLine() 
    End While 

Теперь line2 последняя строка в файле.

+1

Ему также нужно будет переместить его чтение всех полей до цикл while, поэтому он получает данные с первой строки. –

+0

@smoore Вот почему мои первые строки говорят, что сдвинуть цикл «While» сразу после первого «Dim». –

+0

Действительно! Извините, я не последовал этому правилу. +1 для вас, сэр! –