Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0117: CSV-Dateien lesen

 von 

Beschreibung

CSV (Comma Seperated Values)-Dateien sind ein sehr gängiges Dateiformat, da sie sehr einfach und intutiv aufgebaut sind. Sie stellen eine Datentabelle dar, bei der die einzelnen Einträge durch Trennzeichen wie beispielsweise Kommata oder Semikola getrennt sind. Einträge, die selbst das Trennzeichen enthalten, müssen in Anführungszeichen gesetzt werden.

Solche Dateien sind mit der Split()-Funktion zwar einfach zu verarbeiten, doch ist diese oft ineffizient oder produziert Fehler, da sie in Anführungszeichen gesetzte Trennzeichen nicht berücksichtigen kann. Eine Alternative sind Reguläre Ausdrücke. Visual Basic bietet hierfür allerdings von Haus aus schon die TextFieldParser-Klasse an. Damit ist das Verarbeiten von CSV-Dateien ein Kinderspiel.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [11,85 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2008
' Option Strict:    An
' Option Explicit:  An
' Option Infer:     An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'  - System.Core
'  - System.Xml.Linq
'  - System.Data.DataSetExtensions
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'  - System.Linq
'  - System.Xml.Linq
'

' ##############################################################################
' ################################# Form1.vb ###################################
' ##############################################################################
Option Strict On

Imports System.IO
Imports Microsoft.VisualBasic.FileIO

Public Class frmMain

    Private Sub Parse(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdParse.Click

        ' Datenquelle generieren
        ' Hier wird ein Speicherstream verwendet - Der Parser funktioniert mit 
        '  allen Streams, v.A. File-Streams
        Dim CsvBytes = System.Text.Encoding.UTF8.GetBytes(txtSource.Text)
        Dim CsvStream = New MemoryStream(CsvBytes)

        ' CSV-Parser erstellen - Hier wird als Datenquelle die Eingabe gesetzt
        ' Es kann genauso gut ein Dateiname oder ein anderer Stream 
        '  gesetzt werden
        Using Parser = New FileIO.TextFieldParser(CsvStream)
            ' Parser einrichten
            With Parser
                ' Durch Zeichen getrennte Datensätze
                .TextFieldType = FieldType.Delimited

                ' Trennstrings setzen - Erwartet ein Array, hier wird nur 
                '  eines verwendet
                .Delimiters = New String() {txtDelimiter.Text}

                ' Leerzeichen an den Datenelementen löschen
                .TrimWhiteSpace = True
            End With

            Dim Index = 0

            ' Alle Datensätze durchgehen
            Do Until Parser.EndOfData
                Index += 1

                ' Wenn eine Zeile falsch aufgebaut ist, kann hier der Fehler 
                '  MalformedLineException auftreten.
                ' Aktuelle Datenzeile parsen - Dieser Aufruf ist Kernstück des 
                '  ganzen Programms und gibt ein Array aus Strings zurück
                Dim Row = Parser.ReadFields

                ' Anzeigen
                Call lstItems.Items.Clear()
                For Each Item In Row
                    Call lstItems.Items.Add(Item)
                Next

                lblRowNum.Text = Index.ToString
                If MessageBox.Show("Parsen fortsetzen?", "Weiter", _
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _
                    Windows.Forms.DialogResult.No Then Exit Do
            Loop
        End Using

        Call MessageBox.Show("Parsen abgeschlossen", "Fertig", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
        Call CsvStream.Dispose()
    End Sub

End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.