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 29.282 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
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. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats Januar 2025 Dieter Otter Zeilen einer MultiLine-TextBox ermitteln (VB.NET) Dieser Zipp zeigt, wie man die Zeilen einer MultiLine-TextBox exakt so ermitteln kann, wie diese auch in der TextBox dargestellt werden. sevZIP40 Pro DLL Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. |
||||||||||||||||
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. |