vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · MSFlexGrid/DataGrid   |   VB-Versionen: VB609.10.01
FlexGrid mit dem Inhalt einer Textdatei füllen

Füllt ein FlexGrid Control mit dem Inhalt einer Textdatei (z.B. Adressen) und legt vollautomatisch die benötigten Spalten an.

Autor:   Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  28.804 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Textdateien sind beliebt für den externen oder auch internen Datenaustausch. So werden oftmals ganze Datenbank-Tabellen oder auch Excel-Tabellen in das leicht weiterverarbeitbare Ascii-Textformat exportiert. Fast alle gängigen Anwendungen unterstützen sowohl den Ascii-Export, als auch den Import dieser Textdateien.

Die Textdateien selbst sind hierbei zeilenorientiert aufgebaut, d.h. jede Zeile entspricht einen Datensatz (oder eine Zeile einer Excel-Tabelle). Oftmals enthält die erste Zeile der Textdatei noch keine Daten selbst, sondern vielmehr eine Art Feldbeschreibung (Namen der enthaltenen Datenfelder). Die einzelnen Datenfelder werden hierbei durch ein bestimmtes Trennzeichen voneinander getrennt, z.B. durch ein Semiklon (;) oder ein Komma (,). Handelt es sich bei Datenfeldern um Textfelder, also keine Betrags- oder numerische Felder, so steht der Inhalt oftmals auch in Anführungszeichen.

Unser heutiger Tipp zeigt, wie sich eine solche Textdatei in ein FlexGrid Control laden und anzeigen lässt. Die Routinen sind hierbei so universell gehalten, dass Sie weder die Anzahl der Datenzeilen, noch die Anzahl der Datenfelder selbst kennen müssen. All dies wird automatisch ermittelt. Das einzige, was Sie über den Aufbau der Textdatei wissen müssen, ist das verwendete Feld-Trennzeichen und ob die erste Zeile die Feldbeschreibung enthält oder nicht.

' Füllt ein FlexGrid Control mit dem Inhalt einer
' Textdatei (z.B. Adressen)
' 
' "WithHeader" gibt an, ob die erste Zeile die
' Feldbeschreibung (Feldnamen) enthält (True), oder
' nicht (False)
' 
' Über "FieldSep" kann das Feld-Trennzeichen
' festgelegt werden (Vorgabe: Semikolon)
' 
' Sind Felder durch Anführungszeichen eingeschlossen,
' werden diese automatisch entfernt.
' =====================================================
Private Sub FillFlexGrid(ByVal sFilename As String, _
  ByVal WithHeader As Boolean, _
  Optional ByVal FieldSep As String = ";")
 
  Dim F As Integer
  Dim sLine As String
  Dim nCols As Long
  Dim lRow As Long
  Dim lPos As Long
  Dim FieldName As String
  Dim I As Integer
  Dim sText() As String
 
  With MSFlexGrid1
    ' zunächst FlexGrid löschen
    .Rows = 0: .Cols = 0
 
    ' Textdatei öffnen und erste Zeile einlesen
    F = FreeFile
    Open sFilename For Input As #F
 
    ' Einlesen bis Dateiende
    While Not EOF(F)
      Line Input #F, sLine
      If Trim$(sLine) <> "" Then
        ' Zeilenzähler erhöhen
        lRow = lRow + 1
        .Rows = .Rows + 1
 
        ' einzelnen Datenfelder ermitteln
        sText = SplitLine(sLine, FieldSep)
 
        ' Bei der ersten eingelesenen Zeile werden
        ' die Grid-Spalten festgelegt
        If lRow = 1 Then
          nCols = UBound(sText)
          .Cols = nCols
          .Row = 0
 
          ' Erste Zeile = Feldbeschreibung?
          If WithHeader Then
            ' Spalten anhand der Feldbeschreibung
            ' beschriften
            For I = 1 To nCols
              .Col = I - 1
              .Text = sText(I)
            Next I
          Else
            ' Spalten als "Feld1", "Feld2", usw.
            ' beschriften
            For I = 1 To nCols
              .Col = I - 1
              .Text = "Feld " & Format$(I + 1)
            Next I
            .Rows = .Rows + 1
          End If
        End If
 
        ' Daten dem Grid hinzufügen
        If (lRow > 1) Or (lRow = 1 And Not WithHeader) Then
          .Row = .Rows - 1
          For I = 1 To UBound(sText)
            If I > nCols Then Exit For
            .Col = I - 1
            .Text = sText(I)
          Next I
        End If
      End If
    Wend
 
    ' Textdatei schliessen
    Close #F
  End With
End Sub
 
' Zerlegt eine gelesene Textzeile in die einzelnen
' enthaltenen Felder
Private Function SplitLine(ByVal sLine As String, _
  ByVal FieldSep As String) As Variant
 
  Dim nCount As Long
  Dim nUBound As Long
  Dim lPos As Long
  Dim sField As String
  Dim sText() As String
 
  ' Anzahl Felder ermitteln!
  ' Hier wird absichtlich auf die Split-Funktion
  ' verzichtet, da das Trennzeichen ja durchaus
  ' Bestandteil eines Textfeldes sein kann, welches
  ' dann in Anführungszeichen steht.
 
  nCount = 0: lPos = 0
  Do
    lPos = InStr(lPos + 1, sLine, FieldSep)
    If lPos > 0 Then
      sField = Left$(sLine, lPos - 1)
 
      ' Prüfen , ob Feld-Trenner Bestandteil des
      ' Feld-Inhaltes ist
      ' Hierzu wird einfach die Anzahl der
      ' Anführungszeichen gezählt
 
      If CountChar(sField, Chr$(34)) <> 1 Then
        ' gefundene Stelle ist ein Feld-Trennzeichen
        nCount = nCount + 1
        If nCount > nUBound Then
          nUBound = 2 * nCount
          ReDim Preserve sText(nUBound)
        End If
        sText(nCount) = Replace(sField, Chr$(34), "")
        sLine = Mid$(sLine, lPos + 1)
        lPos = 0
      End If
    Else
      ' Letztes Feld innerhalb der Zeile!
      sField = sLine: sLine = ""
      nCount = nCount + 1
      If nCount > nUBound Then
        nUBound = 2 * nCount
        ReDim Preserve sText(nUBound)
      End If
      sText(nCount) = Replace(sField, Chr$(34), "")
    End If
  Loop Until sLine = ""
  ReDim Preserve sText(nCount)
 
  SplitLine = sText
End Function
 
' Zählt die Anzahl Vorkommen eines bestimmten Zeichens
' innerhalb eines Strings
Private Function CountChar(ByVal sLine As String, _
  ByVal sChar As String) As Long
 
  Dim nCount As Long
  Dim lPos As Long
 
  lPos = 0: nCount = 0
  Do
    lPos = InStr(lPos + 1, sLine, sChar)
    If lPos > 0 Then
      nCount = nCount + 1
    End If
  Loop Until lPos = 0
  CountChar = nCount
End Function

Beispiel für den Aufruf der Funktion:

FillFlexGrid App.Path & "\Adressen.txt", True, vbTab

Dieser Tipp wurde bereits 28.804 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel