serbitar
Goto Top

Txt Dateien in Excel importieren

Hallo Kollegen,

Ich möchte gerne mittels Excel eine Txt einlesen und die Infos in Spalten aufteilen.

Die Spaltenheader sind in der Txt mittels "[ ]" angegeben.
Alle darauf folgenden Zeilen sollen bis zum nächsten Spaltenheader in eine Zelle in der Spalte geschrieben werden.
Wenn der Spaltenheader schon existiert dann werden die darauffolgenden Zeilen bis zum nächsten Spalterheader in den entsprechenden schon vorhandenen Header geschrieben.

z.B:

[Name] 
test1
[Beschreibung]
bla1
....
[Name]
test2
[Beschreibung]
bla2

wird zu:

[Name]
test1
test2
[Beschreibung]
bla1
bla2

das ganze soll bis EoF oder bis "***" erkannt wird laufen.
Es handelt sich bei allen Daten um Text.

Kann mir bitte jemand von euch dabei helfen? Vielen Dank im Voraus!!

lg

Content-Key: 303635

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

Ausgedruckt am: 29.03.2024 um 09:03 Uhr

Mitglied: colinardo
Lösung colinardo 04.05.2016 aktualisiert um 18:11:34 Uhr
Goto Top
Hallo Serbitar, Willkommen auf Administrator.de!
Habe dir hier ein Beispiel dafür hochgeladen: excel_parse_txt_to_columns_303635.zip
Entpacke beide Dateien in ein Verzeichnis und führe das Makro mit dem Button auf dem Sheet aus dann werden die Daten aus der demo.txt in das Sheet importiert.

Hier noch der kommentierte Code daraus
Sub ImportTextData()
    'Variablen  
    Dim fso As Object, dic As Object, regex As Object, matches As Object, match As Object, intCol As Long, strFile As String
    ' Pfad der Datei  
    strFile = ThisWorkbook.Path & "\demo.txt"  
    ' Objekte erstellen  
    Set fso = CreateObject("Scripting.FileSystemObject")  
    Set dic = CreateObject("Scripting.Dictionary")  
    Set regex = CreateObject("vbscript.regexp")  
    ' Regex Optionen setzen  
    regex.Global = True: regex.IgnoreCase = True: regex.MultiLine = True
    ' Regex Pattern zur extrahierung der Sections mit deren Daten  
    regex.Pattern = "^\[([^\[]+)\]\s*([^\[]*)"  
    ' Regex ausführen  
    Set matches = regex.Execute(fso.OpenTextFile(strFile, 1, False, -2).ReadAll())
    intCol = 1
    With ActiveSheet
        ' Erste Zeile Überschriften fett machen  
        Range("1:1").Font.Bold = True  
        ' Für jede Section  
        For Each match In matches
            'Name der Section holen  
            strSection = match.submatches(0)
            'Items der Section holen  
            arrData = WorksheetFunction.Transpose(Split(match.submatches(1), vbNewLine))
            ' Existiert die Section schon ?  
            If Not dic.Exists(strSection) Then
                ' es ist eine neue Section, füge sie dem Dictionary hinzu  
                dic.Add strSection, intCol
                ' Schreibe die Sectionüberschrift in Zeile 1 der neuen Spalte  
                .Cells(1, intCol).Value = strSection
                ' Schreibe die Items unter die Überschrift  
                .Cells(2, intCol).Resize(UBound(arrData), 1).Value = arrData
                ' Index der nächsten Spalte setzen  
                intCol = intCol + 1
            Else
                ' Section existiert schon, füge die Items in der jeweiligen Spalte unten an  
                .Cells(Rows.Count, dic.Item(strSection)).End(xlUp).Offset(1, 0).Resize(UBound(arrData), 1).Value = arrData
            End If
        Next
        'Spaltenbreiten an Inhalt anpassen  
        .UsedRange.EntireColumn.AutoFit
    End With
End Sub
Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate

[OT]
@127944
Zitat von @127944:
wenn du das möchtest, dann darfst du das von mir aus auch gerne machen.
Nicht dein Ernst ? *Kopfschüttel*. Wenn du in einem Beitrag nichts konstruktives beitragen kannst solltest du in Zukunft solche Kommentare unterdrücken, die sind in einem Administrator-Forum wirklich überflüssig, bringen keinem etwas und senken das Niveau, kein Wunder das hier dann in letzter Zeit so viele kompetente User die Segel streichen wenn ich so was lese, sorry.
[/OT]
Mitglied: 127944
127944 06.05.2016 um 08:48:15 Uhr
Goto Top
[OT]
Hallo Uwe,
bei allem gebührenden Respekt - aber deine Schlussfolgerung ist meiner bescheidenden Meinung nach schlicht falsch.

Nicht dein Ernst ? *Kopfschüttel*.
Doch mein voller Ernst. Nur ein netter Hinweis durch die Blume, das der TO schlicht vergessen hat, eine Frage zu stellen. Selbst der TO scheint die Ironie verstanden zu haben.

Wenn du in einem Beitrag nichts konstruktives beitragen kannst
Ich bin durchaus in der Lage die Frage des TO zu beantworten. Dazu musste er diese aber erst einmal stellen. Hätte ja sein können, das er nur ein triviales Problem hat.

solltest du in Zukunft solche Kommentare unterdrücken, die sind in einem Administrator-Forum wirklich überflüssig,
Ansichtssache

bringen keinem etwas und senken das Niveau,
Das stimmt, wie man sieht, nicht. Der TO hat seine Frage gestellt und hat damit die Basis für eine Hilfestellung geliefert.

kein Wunder das hier dann in letzter Zeit so viele kompetente User die Segel streichen
Das hat eher mit lernresistenten und faulen Fragestellern zu tun

wenn ich so was lese, sorry.
Das habe ich auch gedacht, wie ich deinen Absatz gelesen habe.

Es ist dein gutes Recht, dich von Usern, die null Eigeninitiative zeigen, vor den Karren spannen zu lassen. Mir ist es auch egal, das du in einem Forum um Spenden ...
Dein Ding - nicht meines.
[/OT]
Mitglied: colinardo
colinardo 06.05.2016 aktualisiert um 09:56:20 Uhr
Goto Top
Zitat von @127944:
//Nicht dein Ernst ? *Kopfschüttel*.
Doch mein voller Ernst. Nur ein netter Hinweis durch die Blume, das der TO schlicht vergessen hat, eine Frage zu stellen. Selbst der TO scheint die Ironie verstanden zu haben.
Aus dem Thread geht eindeutig hervor was er machen möchte, sonst hätte ich wohl diesen Code nicht zusammenschreiben können.
Wenn du in einem Beitrag nichts konstruktives beitragen kannst
Ich bin durchaus in der Lage die Frage des TO zu beantworten. Dazu musste er diese aber erst einmal stellen. Hätte ja sein können, das er nur ein triviales Problem hat.
Das Problem war eindeutig, und jemand der weiß wie man sowas in Excel löst kann es auch direkt beantworten wie du siehst.
bringen keinem etwas und senken das Niveau,
Das stimmt, wie man sieht, nicht. Der TO hat seine Frage gestellt und hat damit die Basis für eine Hilfestellung geliefert.
Du meinst also mit:

,kann mir vielleicht jemand dabei helfen?
hast du nun verstanden worum es beim Thema geht, nur wegen dem fehlenden Fragezeichen im Ursprungsbeitrag??? Unwahrscheinlich ...

Es ist dein gutes Recht, dich von Usern, die null Eigeninitiative zeigen, vor den Karren spannen zu lassen. Mir ist es auch egal, das du in einem Forum um Spenden ...
Dein Ding - nicht meines
Nein, ich fördere nur den Prozentsatz an nutzbaren Lösungen hier im Forum, auch indem ich meinen Code detailliert kommentiere. Ob jemand sich nun hinsetzt und versucht den Code zu verstehen oder nicht ist seine Sache. Das ist ein Forum in dem man den Fragestellern hilft und nicht indem man sie mit provozierenden Fragen wieder vertreibt. Beim TO hattest du noch mal Glück das er so verständnisvoll reagiert hat.
Bedenke immer das auch andere Leute hier vorbei schauen und sowas trägt auch indirekt zum Bild des Forums bei. Ob ein TO nun davon was lernt oder nicht ist nicht unser Bier, aber der nutzbare Inhalt eines Forums macht es Interessant nicht nutzlose Kommentare.

Also, wenn Ihr hier schreibt dann helft doch bitte dem Fragesteller oder verkneift euch den Kommentar, wenn euch die Zeit für eine vernünftige Antwort fehlt! Danke.

Den Rest lasse ich jetzt die Mods entscheiden.

Grüße Uwe
Mitglied: 127944
127944 06.05.2016 um 10:13:50 Uhr
Goto Top
Weißt was: Ich erfülle dir deinen Wunsch und mache es Jodel & Co gleich. Dafür ist mir meine Zeit zu schade, als das ich mich für den Support, den ich hier kostenlos Leiste, auch noch vor einer selbsternannten Moralkommission rechtfertigen müsste.
Mitglied: colinardo
colinardo 06.05.2016 aktualisiert um 10:49:49 Uhr
Goto Top
Du verstehst mich falsch. Wir alle opfern hier unsere übrige Zeit um anderen zu helfen. Aber manchmal sollte man halt zwei mal darüber nachdenken ob ein Kommentar sinnvoll war oder nicht.
Das ich einen Spendenlink unter manche (meist nur gute) Beiträge setze heißt ja nicht das ich das nur gegen Dollars mache, im Gegenteil: Wen anhand der Lösung geholfen wurde kann aus freien Stücken Feedback geben oder auch nicht. Ich sehe daran dann welche Beiträge hier gesucht sind.
Wenn dann was gespendet wird kommt es hier einem guten Zweck zu gute.
Mitglied: 127944
127944 06.05.2016 um 11:00:13 Uhr
Goto Top
Zitat von @colinardo:
Aber manchmal sollte man halt zwei mal darüber nachdenken ob ein Kommentar sinnvoll war oder nicht.
Warum hälst du dich nicht selbst an deinen hervorragenden Tip? Du hast den ganzen Thread ruiniert, nur um ein wenig Recht zu haben. Schade. Dabei geht dein wirklich guter Lösungsansatz völlig unter
Mitglied: Serbitar
Serbitar 09.05.2016 um 09:48:21 Uhr
Goto Top
Hui da war ja in dem unschuldigen Thread noch einiges los!

Erstmal vielen Dank an @colinardo für die Hilfe - ich werde gleich schauen ob ich sie richtig anwenden kann.

Ich habe im Initialpost die letzte Zeile (also die Bitte um Hilfe) nicht explizit reingeschrieben, da ich dachte sie wäre impliziert.
Es gibt allerdings in Online Foren gewisse Formalismen auf die Wert gelegt wird, und deswegen habe ich nach dem Kommentar von 127944 meinen Post editiert. Sollte es dadurch zu Missverständnissen gekommen sein, tut es mir leid.

lg
Mitglied: Serbitar
Serbitar 09.05.2016 um 10:41:44 Uhr
Goto Top
Also ich hab jetzt deinen Code mittels meiner Datei ausgeführt und soweit funktionierts schon ganz gut.

Was allerdings noch nicht ganz passt ist dass auf die ""-header folgenden Zeilen nicht in eine Zelle geschrieben werden, wenn ein Zeilenumbruch vorhanden ist sondern jede Zeile in eine eigene Zelle.

Und als ich statt deiner txt meine genommen habe und auf den Knopf drücke kommt immer eine Fehlermeldung mit: "Typen unverträglich" allerdings arbeitet das Makro trotzdem scheinbar fehlerfrei.


Vielen Dank, du hast mir extrem viel Arbeit abgenommen!!
Mitglied: colinardo
colinardo 09.05.2016 aktualisiert um 13:02:04 Uhr
Goto Top
Zitat von @Serbitar:
Was allerdings noch nicht ganz passt ist dass auf die ""-header folgenden Zeilen nicht in eine Zelle geschrieben werden, wenn ein Zeilenumbruch vorhanden ist sondern jede Zeile in eine eigene Zelle.
Gut das ging leider aus deinem ersten Post nicht so ganz eindeutig hervor das alle Elemente in eine einzige Zelle eingefügt werden sollen. Ist aber kein Problem, ein klein bisschen umgeschrieben, dann landet alles pro Block in einer Zelle unter der Überschrift.
Sub ImportTextData()
    'Variablen  
    Dim fso As Object, dic As Object, regex As Object, matches As Object, match As Object, intCol As Long, strFile As String, strData As String
    ' Pfad der Datei  
    strFile = ThisWorkbook.Path & "\demo.txt"  
    ' Objekte erstellen  
    Set fso = CreateObject("Scripting.FileSystemObject")  
    Set dic = CreateObject("Scripting.Dictionary")  
    Set regex = CreateObject("vbscript.regexp")  
    ' Regex Optionen setzen  
    regex.Global = True: regex.IgnoreCase = True: regex.MultiLine = True
    ' Regex Pattern zur extrahierung der Sections mit deren Daten  
    regex.Pattern = "^\[([^\[]+)\]\s*([^\[]*)"  
    ' Regex ausführen  
    Set matches = regex.Execute(fso.OpenTextFile(strFile, 1, False, -2).ReadAll())
    intCol = 1
    With ActiveSheet
        ' Erste Zeile Überschriften fett machen  
        Range("1:1").Font.Bold = True  
        ' Für jede Section  
        For Each match In matches
            'Name der Section holen  
            strSection = match.submatches(0)
            'Items der Section holen  
            strData = match.submatches(1)
            ' Existiert die Section schon ?  
            If Not dic.Exists(strSection) Then
                ' es ist eine neue Section, füge sie dem Dictionary hinzu  
                dic.Add strSection, intCol
                ' Schreibe die Sectionüberschrift in Zeile 1 der neuen Spalte  
                .Cells(1, intCol).Value = strSection
                ' Schreibe die Items unter die Überschrift  
                .Cells(2, intCol).Value = strData
                ' Index der nächsten Spalte setzen  
                intCol = intCol + 1
            Else
                ' Section existiert schon, füge die Items in einer neuen Zelle unter der Überschrift an  
               .Cells(Rows.Count, dic.Item(strSection)).End(xlUp).Offset(1, 0).Value = strData
            End If
        Next
        'Spaltenbreiten an Inhalt anpassen  
        .UsedRange.EntireColumn.AutoFit
    End With
End Sub
Und als ich statt deiner txt meine genommen habe und auf den Knopf drücke kommt immer eine Fehlermeldung mit: "Typen unverträglich" allerdings arbeitet das Makro trotzdem scheinbar fehlerfrei.
Vermutlich einfach ein Kodierungsproblem der Textdatei beim einlesen.
Starte den Debugger und gehe den Code mit F8 schrittweise durch und nenne mir die Zeiile in der der Fehler auftritt.
Die Kodierung lässt sich mit dem letzten Parameter von
fso.OpenTextFile(strFile, 1, False, -2) festlegen.
CONSTANT 	VALUE 	DESCRIPTION
TristateTrue 	-1 	Opens the file as Unicode
TristateFalse 	0 	Opens the file as ASCII
TristateUseDefault 	-2 	Use default system setting
Du kannst dich auch gerne per PM kontaktieren und mir eine deiner Beispieldateien zur Verfügung stellen dann teste ich es mit der Datei.

Grüße Uwe