mhsk97
Goto Top

Einlesen von Txt-Dateien mit unterschiedlichen Trennern mit Excel VBA

Hallo Wissende,

ich habe eine Textdatei mit unterschiedlichen Trennern vorliegen die ich über ein Excelmakro einlesen und schlußendlich als SQL Daten in SQL2012 von Excel importieren möchte.

Die Datei sieht vom Inhalt so aus:

[Params]
Version=106
Monitor=38
SMode=111000100
Date=20140221
StartTime=17:29:19.0
Length=01:09:15.0
Interval=5
Upper1=166
Lower1=147
Upper2=0
Lower2=0
Upper3=180
Lower3=130
Timer1=00:00:00.0
Timer2=00:00:00.0
Timer3=00:00:00.0
ActiveLimit=0
MaxHR=210
RestHR=60
StartDelay=0
VO2max=33
Weight=87

[Note]

Mustertext 123456

[IntTimes]
00:06:46.2 141 92 136 146
0 0 0 94 87 175
0 0 0 0 0
0 99 7 0 220 0 0
89 1 62067654 139917504 20 0
00:14:59.9 152 142 150 159
0 0 0 71 82 175
0 0 0 0 0
0 1002 0 180 0 0
75 1 61657510 168720896 22 0
00:23:30.6 157 151 157 161
0 0 0 66 80 174
0 0 0 0 0
0 1003 0 170 0 0
74 1 71395382 184196608 20 0
00:32:32.4 153 146 153 160
0 0 0 65 79 173
0 0 0 0 0
0 1003 0 180 0 0
72 1 70329846 175524304 45 0
00:36:59.5 155 92 150 161
0 0 0 74 87 175
0 0 0 0 0
0 4541 0 190 0 0
77 0 62657526 166917537 56 0

[IntNotes]
1
2
3
4
5

[ExtraData]

1 2 3
2 2 6
3 2 7
4 2 4
5 1

[LapNames]
1 2
2 2
3 2
4 2
5 1

[Summary-123]
4135 0 0 1780 1140 1215
210 166 147 60
4135 0 0 1780 1140 1215
210 0 0 60
0 0 0 0 0 0
21 0 0 0 60
0 831

[Summary-TH]
4135 0 0 2305 615 1215
210 180 130 60
0 831

[HRZones]
210
189
168
147
126
105


[SwapTimes]
4135 0 0 2305 615 1215
210 180 130 60
0 831


[Trip]
52

4160
169
177

1540


[HRData]
92 0 0 175
92 0 0 175
93 65 85 175
97 85 86 175
101 91 86 175
104 92 87 175
108 93 87 175
110 94 86 175
113 95 86 175
116 95 86 175

Nun möchte ich gerne pro Abschnittsnamen die in jeder Zeile unterschiedlich häufigen Datensätze einzeln in Zeilen dargestellt bekommen und scheitere an den unterschiedlichen Trennsymbolen. Aussehen soll es später so:

Params Version 106
Params Monitor 38
Params SMode 111000100
Params Date 20140221
Params StartTime 17:29:19.0
Params Length 01:09:15.0
Params Interval 5
Params Upper1 166
Params Lower1 147
Params Upper2 0
Params Lower2 0
Params Upper3 180
Params Lower3 130
Params Timer1 00:00:00.0
Params Timer2 00:00:00.0
Params Timer3 00:00:00.0
Params ActiveLimit 0
Params MaxHR 210
Params RestHR 60
Params StartDelay 0
Params VO2max 33
Params Weight 97

Note Mustertext 123456

IntTimes 00:06:46.2
IntTimes 141
IntTimes 92
IntTimes 136
IntTimes 146
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 94
IntTimes 87
IntTimes 175
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 997
IntTimes 0
IntTimes 220
IntTimes 0
IntTimes 0
IntTimes 89
IntTimes 1
IntTimes 62067654
IntTimes 139917504
IntTimes 20
IntTimes 0
IntTimes 00:14:59.9
IntTimes 152
IntTimes 142
IntTimes 150
IntTimes 159

usw....

Diese Daten möchte ich dann in eine SQL Datenbank importieren.

Leider gelingt mir weder das Einlesen noch der Import.

Kann mir jemand weiterhelfen?

Mit vielen Dank im Voraus.

Michael

Content-Key: 258294

Url: https://administrator.de/contentid/258294

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: colinardo
colinardo 22.12.2014 aktualisiert um 13:17:41 Uhr
Goto Top
Hallo Michael,
für deinen Import kannst du das hier nehmen:
(Codezeilen sind kommentiert)
Sub ImportTextFile()
    'Pfad der Textdatei  
    Const TEXTFILE = "C:\temp\test.txt"  
    
    'Variablen  
    Dim fso, arrContent, strLine, strSection, strDelim, arrCols, secCount
    Dim rngOut As Range
    'Objekte  
    Set fso = CreateObject("Scripting.FileSystemObject")  
    'Textdatei in Array einlesen  
    arrContent = Split(fso.OpenTextFile(TEXTFILE, 1).ReadAll(), vbNewLine)
    
    'Startausgabezelle setzen  
    Set rngOut = Sheets(1).Range("A1")  
    Range("A:ZZ").NumberFormat = "@"  
    
    'Für jede Zeile der Textdatei ...  
    For Each strLine In arrContent
        strLine = Trim(strLine) 'entferne eventuelle Leerzeichen  
        'entferne eventuelle Tabs am Ende der Zeile  
        If Right(strLine, 1) = Chr(9) Then strLine = Left(strLine, Len(strLine) - 1)
        'Wenn die Zeile nicht leer ist  
        If strLine <> "" Then  
            'Wenn mit der Zeile eine Sektion startet speichere den aktuellen Sektionsnamen  
            If Left(strLine, 1) = "[" Then  
                If secCount = 0 Then
                    rngOut.Value = strSection
                    Set rngOut = rngOut.Offset(1, 0)
                End If
                strSection = Mid(strLine, 2, Len(strLine) - 2)
                secCount = 0
            Else    'keine Sektion -> Datenzeile  
                secCount = secCount + 1
                'Prüfe und setze Spaltentrenner  
                If InStr(1, strLine, "=", vbTextCompare) Then  
                    strDelim = "="  
                Else
                    strDelim = Chr(9)
                End If
                'Spalten der Zeile in Array schreiben  
                arrCols = Split(strLine, strDelim, -1, vbTextCompare)
                
                
                If strDelim = Chr(9) Then
                    For i = 0 To UBound(arrCols)
                        rngOut.Value = strSection
                        rngOut.Offset(0, 1).Value = arrCols(i)
                        Set rngOut = rngOut.Offset(1, 0)
                    Next
                Else
                    rngOut.Value = strSection
                    rngOut.Offset(0, 1).Value = arrCols(0)
                    rngOut.Offset(0, 2).Value = arrCols(1)
                    Set rngOut = rngOut.Offset(1, 0)
                End If
            End If
        End If
    Next
End Sub
Grüße Uwe
Mitglied: mhsk97
mhsk97 22.12.2014 um 11:13:51 Uhr
Goto Top
Hallo Uwe,

herzlichen Dank für die superschnelle Antwort.

Da keine Leerzeichen sondern Tabs als Trenner vorhanden sind habe ich deinen Code bereits dahingehend angepasst.

Nun stellt mir der Code jedoch leider nicht die Tab-getrennten Daten zeilenweise sondern immer noch in Spalten aufgeteilt dar. Wie bekomme ich es hin das diese Daten einzeln untereinander stehen?

So ist es nun gem. Makro:

IntTimes 00:06:46.2 141 92 136 146
IntTimes 0 0 0 94 87 175
IntTimes 0 0 0 0 0
IntTimes 0 997 0 220 0 0
IntTimes 89 1 62067654 139917504 20 0

So wäre es erforderlich:

IntTimes 00:06:46.2
IntTimes 141
IntTimes 92
IntTimes 136
IntTimes 146
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 94
IntTimes 87
IntTimes 175
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 0
IntTimes 997
IntTimes 0
IntTimes 220
IntTimes 0
IntTimes 0
IntTimes 89
IntTimes 1
IntTimes 62067654
IntTimes 139917504
IntTimes 20
IntTimes 0

... und wie bekomme ich diese Daten dann in eine SOL Datenbank?

Nochmals vielen Dank für die schnelle Antwort, ich habe mich sehr darüber gefreut.

Beste Grüße

Michael
Mitglied: colinardo
colinardo 22.12.2014 aktualisiert um 11:39:41 Uhr
Goto Top
Zitat von @mhsk97:
Da keine Leerzeichen sondern Tabs als Trenner vorhanden sind habe ich deinen Code bereits dahingehend angepasst.
Das war dann deiner Formatierung ohne Code-Tags geschuldet face-wink (Bitte in Zukunft beachten.Merci.)
Nun stellt mir der Code jedoch leider nicht die Tab-getrennten Daten zeilenweise sondern immer noch in Spalten aufgeteilt dar. Wie
bekomme ich es hin das diese Daten einzeln untereinander stehen?
OK das hatte ich dann fehlinterpretiert, ist oben dahingehend abgeädnert.
... und wie bekomme ich diese Daten dann in eine SOL Datenbank?
Ohne Info wie das in welche Tabellen mit welchem Format muss, ein Raten mit der Christbaumkugel ....

Grüße Uwe
Mitglied: mhsk97
mhsk97 22.12.2014 um 12:18:47 Uhr
Goto Top
Hallo Uwe,

das ist ja unglaublich wie schnell das geht. Klappt wunderbar mit 2 Ausnahmen:

Es gibt Abschnitte die nicht in jeder Datei gefüllt sind, sondern nur der Abschnittsname steht, wäre super wenn dieser in der Auflistung ohne Daten erscheint.

Bsp.:

[ExtraData]


Als zweites gibt es Abschnitte die nur 1x oder 2x Daten beinhalten. Bsp.:

[IntNotes]
1
2
3
4
5

bzw.

[LapNames]
1 2
2 2
3 2
4 2
5 1

Diese werden nun leider immer mit einem zusätzlichen Leerfeld nach dem Makrodurchlauf aufgeführt:

IntNotes 1
IntNotes
IntNotes 2
IntNotes
IntNotes 3
IntNotes
IntNotes 4
IntNotes
IntNotes 5
IntNotes

bzw.:

LapNames 1
LapNames 2
LapNames
LapNames 2
LapNames 2
LapNames
LapNames 3
LapNames 2
LapNames
LapNames 4
LapNames 2
LapNames
LapNames 5
LapNames 1
LapNames

Bekommt man diese Leerzeilen irgendwie weg?

Zum Eintrag in eine SQL Datenbank würde mir ein Musterbeispiel zum Öffnen der DB, Anlegen der Spalten und Schreiben der Daten vlt. schon weiterhelfen.... wenn Du mir dann noch bei evtl. auftretenden Problemen noch zur Seite stehen würdest wäre ich dankbar. Ich möchte Dich und Deine Fähigkeiten natürlich nicht mit Christbaumkugelraten belasten face-wink)

Beste Grüße

Michael
Mitglied: colinardo
colinardo 22.12.2014 aktualisiert um 12:54:01 Uhr
Goto Top
Zitat von @mhsk97:
Es gibt Abschnitte die nicht in jeder Datei gefüllt sind, sondern nur der Abschnittsname steht, wäre super wenn dieser
in der Auflistung ohne Daten erscheint.
ist oben angepasst
Als zweites gibt es Abschnitte die nur 1x oder 2x Daten beinhalten. Bsp.:

[IntNotes]
1
2
3
4
5
Diese werden nun leider immer mit einem zusätzlichen Leerfeld nach dem Makrodurchlauf aufgeführt:
Bekommt man diese Leerzeilen irgendwie weg?
kann ich hier nicht nachvollziehen, läuft mit meinem Code hier wie gewünscht ..., da du deine Daten aber immer ohne Codetags postest, denke ich, es liegt an deinen Textdateien.
Zum Eintrag in eine SQL Datenbank würde mir ein Musterbeispiel zum Öffnen der DB, Anlegen der Spalten und Schreiben der
Daten vlt. schon weiterhelfen....
hier siehts nämlich als Ergebnis im Excel-Sheet so aus:
IntTimes	0
IntNotes	1
IntNotes	2
IntNotes	3
IntNotes	4
IntNotes	5
ExtraData	1
ExtraData	2
ExtraData	3
ExtraData	2
ExtraData	2
Dazu gibt es Beispiele "en masse":

Viel Erfolg
Grüße Uwe
Mitglied: mhsk97
mhsk97 22.12.2014 um 13:02:45 Uhr
Goto Top
Hallo Uwe,

vielen Dank.

Das mit den Code-Tags habe ich nicht wirklich verstanden.

Kann ich Dir eine Musterdatei einmal zusenden. Dann könntest Du mir vlt. besser helfen.... Wie sende ich Dir eine Datei?

Beste Grüße

Michael
Mitglied: colinardo
colinardo 22.12.2014 um 13:05:02 Uhr
Goto Top
Zitat von @mhsk97:
Das mit den Code-Tags habe ich nicht wirklich verstanden.
Ist doch nicht schwer: <code> Quellcode </code>.

Kann ich Dir eine Musterdatei einmal zusenden. Dann könntest Du mir vlt. besser helfen.... Wie sende ich Dir eine Datei?
ich schick dir ne PM...
Mitglied: colinardo
colinardo 22.12.2014 aktualisiert um 14:19:45 Uhr
Goto Top
In deinem File waren in den zwei Sections abschließende Tabs vorhanden die das Verhalten verursacht haben. Habe für diesen Fall oben dafür einen Fix eingebaut.

Grüße Uwe
Mitglied: mhsk97
mhsk97 22.12.2014 um 20:41:45 Uhr
Goto Top
Hallo Uwe,

funktioniert tadellos, spitzenklasse. Nochmals herzlichen Dank. Beneide Dich um Deine VBA-Kenntnisse. Habe gefühlt ewig daran herumprobiert und es nicht so hinbekommen.

Versuche mich nun mit Deinen Tipps an der SQL-Übertragung.

Darf ich bei Problemen diesbezüglich noch einmal auf Dich zurück kommen?

Nochmals besten Dank.

Viele Grüße

Michael
Mitglied: colinardo
colinardo 22.12.2014 aktualisiert um 22:24:07 Uhr
Goto Top
Darf ich bei Problemen diesbezüglich noch einmal auf Dich zurück kommen?
mach das face-wink, ich hoffe aber das zumindest MS-SQL-Server Grundkenntnisse vorhanden sind ?! Wenn nicht, bitte dazu erst einlesen, merci.

Nochmals besten Dank.
Keine Ursache.

Als denn schöne Feiertage
Grüße Uwe

p.s. Ich frage mich warum du den Umweg über Excel gehen willst ? Musst du die Daten noch nachbearbeiten ?
Zur Info: Das ganze geht auch direkt mit VBS ohne erst den Zwischenschritt in Excel zu vollziehen.
Mitglied: colinardo
Lösung colinardo 24.12.2014 aktualisiert um 14:31:52 Uhr
Goto Top
Nicht vergessen den Beitrag bitte noch auf gelöst zu setzen, das Ursprungsproblem wurde ja gelöst. Merci.

Frohes Fest
Grüße Uwe
Mitglied: mhsk97
mhsk97 24.12.2014 um 14:33:16 Uhr
Goto Top
Hallo Uwe,

erl. steht auf gelöst.

Dir auch ein frohes weihnachtsfest und einen guten und vor allem gesunden Rutsch ins neue Jahr.

Beste Grüße

Michael