2016-06-19 24 views
0

Ich benutze dieses Code-Snippet (hier gefunden), um eine CSV-Datei in ein Array zu lesen.vb.net 2013 - Leerzeilen mit streamreader entfernen

Meine Quelldatei enthält 2 - 3 leere Zeilen am Ende der Datei. Trotz Verwendung von Trim() - ich bekomme immer noch diese Leerzeilen in das Array eingefügt, und dies verursacht den Rest meines Codes fehlschlagen.

Ich habe überprüft, dass es funktioniert, indem Sie die leeren Zeilen löschen.

Ich habe verschiedene Techniken ausprobiert, die hier und auf MSDN gefunden wurden, aber ich kann diese leeren Zeilen einfach nicht loswerden.

Kann mir bitte jemand helfen?

Danke.

+1

überprüfen, ob 'sData (0) 'oder' sData (1) '' IsNullOrEmpty' – Plutonix

Antwort

1

Sie die Zeile in eine separate Variable lesen und überprüfen, ob das vor Parsen der Daten leer ist:

Using sr As New StreamReader(sFile) 
    While Not sr.EndOfStream 
     Dim sLine As String = sr.ReadLine() 
     If Not String.IsNullOrWhiteSpace(sLine) Then 
      sData = sLine.Split(","c) 

      arrName.Add(sData(0).Trim()) 
      arrValue.Add(sData(1).Trim()) 
     End If 
    End While 
End Using 

Sie auch weiterhin Gültigkeit hinzufügen möchten checks (zB wenn es kein Komma gibt, wird sData(1) eine Ausnahme auslösen, und was passiert, wenn mehrere Kommas vorhanden sind?).

+0

Danke, das hat funktioniert. – Tony

0
sr.ToString().TrimEnd(Environment.NewLine.ToCharArray()) 

oder

'vbCrLf or vbNewLine (might work as well) 
+0

Ich ersetzte "While Not sr.EndOfStream" mit Ihrem ersten Beispiel und ich bekomme den folgenden Fehler: Konvertierung von Zeichenfolge "System.IO.StreamReader" auf "Long" ist ungültig. – Tony

2

Ich würde den Streamreader überspringen und File.ReadLines() Methode verwenden. Dies gibt eine zählbare, die mit der Where() Funktion arbeiten können:

For Each line As String in File.ReadLines(sFile).Where(Function(l) Not String.IsNullOrWhiteSpace(l)) 
    Dim data = line.Split(","c) 
    arrName.Add(data(0).Trim()) 
    arrValue.Add(data(1).Trim()) 
Next line 

Zusätzlich gepaart Arrays/Listen, wie arrName und arrValue sind ein Anti-Muster. Viel besser eine kleine Klasse verwenden:

Public Class MyData 
    Public Property Name As String 
    Public Property Value As String 

    Public Sub New(ByVal line As String) 
     Dim data() as String = line.Split(","c) 
     Name = data(0).Trim() 
     Value = data(1).Trim() 
    End Sub 
End Class 

Jetzt können Sie eine einzige Liste wie folgt aussehen:

Dim data As List(Of MyData) 

Und Sie können den Rest des Codes in einer einzigen Zeile schreiben:

data = File.ReadLines(sFile).Where(Function(l) Not String.IsNullOrWhiteSpace(l)).Select(Function(s) New MyData(l)).ToList() 

aber zur besseren Lesbarkeit:

Dim data As List(Of MyData) = File.ReadLines(sFile). 
     Where(Function(l) Not String.IsNullOrWhiteSpace(l)). 
     Select(Function(s) New MyData(s)). 
     ToList() 
+0

Danke für eine umfassende Antwort, aber ich konnte das nicht zum Laufen bringen. Ich kann mich nicht erinnern, was der Fehler war (!), Aber IIRC war mit String-Fehlern verbunden. – Tony