Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
744to748
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
744to748
744to748
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Abschnitte aus Textdateien auslesen / separieren

Abschnitte aus Textdateien auslesen / separieren
17.03.2006 21:43:39
Jens
Hallo zusammen,
ich habe ein Problem, bei dem ich einfach nicht weiterkomme.
Ich habe ein wenig VBA-Kenntnisse und mit dem wahren Fundus an Code-Schnippseln hier auch schon herumprobiert und zwar so lange, bis ich einen sprichwörtlichen Knoten im Kopf hatte.
Vielleicht mag sich jemand dem folgenden Problem annehmen:
Ich möchte aus allen Textdateien eines Verzeichnisses ( z.B. C:\Beispiele) einen innerhalb jeder Datei mehrfach _UND_ an unterschiedlichen Positionen vorkommenden Textbereich auslesen und in eine Sammeldatei schreiben.
Den Beginn der gesuchten Abschnitte habe ich per Suchen Ersetzen schon so definiert, dass er überall gleich ist ("_$ANFANG$_"), ebenfalls das Ende ("_$ENDE$_"). Innerhalb einer Datei können allerdings mehrere dieser Abschnitte vorkommen und die zeichen- und zeilenzahl dazwischen ist variabel.
Nur mit dem Splitten funktioniert es nicht. Ich habe hin und her probiert und nachher ging gar nichts mehr.... :-((
Beispieldatei 1.txt:
(sie enthält in diesem Fall 2 Abschnitte, die mich interessieren: eingeleitet durch _$ANFANG$_ und beendet durch _$ENDE$_), beide Abschnitte möchte ich ausschneiden und in die Sammeldatei ergebnis.txt schreiben.
Tineo. Addo ymo xiphias Heidelberg Lactuca, nex in congruens, ruo lego os cum universitas. Tellus vas neo prothoplastus Improviso cui te curvo. Eo privus ars Iussu infodio, _$ANFANG$_ut ich schaff es einfach nicht _$ENDE_fides Fruor, modio per opus Marceniense Cassus gestum volup diatesseron munio. Pulpa ac his simulo demens illum Ne archidictus, pes capistrum curo nam intolerabiliter Succumbo vis Effor per. Tineo. Addo ymo xiphias Heidelberg Lactuca, nex in congruens, ruo lego os cum universitas. Tellus vas neo prothoplastus Improviso cui te curvo. Eo privus ars Iussu infodio, _$ANFANG$_ut bitte helfen bite helfen _$ENDE_fides Fruor, modio per opus Marceniense Cassus gestum volup diatesseron munio. Pulpa ac his simulo demens illum Ne archidictus, pes capistrum curo nam intolerabiliter Succumbo vis Effor per.
Das Ergebnis dieser Datei wäre gewesen: ich schaff es einfach nicht - bitte helfen bitte helfen
Beispieldatei 2.txt (usw. mit 3.txt etc) hat ebenfalls einen oder mehrere Abschnitte mit unterschiedlichen Zeilen- und Zeichenlängen zwischen _$ANFANG$_ und _$ENDE$_, die ich ebenfalls separieren möchte.
Wie schaffe ich es nun, alle Dateien eines Verzeichnisses nach den o.a. Teilabschnitten zu durchsuchen und sie allesamt in eine Datei namens ergebnis.txt zu schreiben? Das schöne ist, dass sie alle die Trennmarken _$ANFANG$_ bzw. _$ENDE$_ schon besitzen.
Das kann eigentlich nicht so schwer sein, nur ich schaffe es beim besten Willen nicht und bin dankbar für ein Codeschnippsel, dass keinen Knoten im Kopf verursacht.
Vielen Dank für eure Mithilfe!
Jens

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Abschnitte aus Textdateien auslesen / separier
17.03.2006 22:08:09
MichaV
Hallo Jens,
so okay?


Option Explicit
Sub texteinlesenundteilezwischenanfangundendeextrahieren()
Dim varDatei As Variant
Dim strInhalt As String
Dim strTeile() As String
Dim strErgebnis As String
Dim i As Integer
'Datei wählen lassen
varDatei = Application.GetOpenFilename(, , "Welche Datei?")
If VarType(varDatei) = vbBoolean Then MsgBox "Abgebrochen": Exit Sub
'Datei in eine Variable einlesen
Open varDatei For Binary As #1
strInhalt = Space(LOF(1))
Get #1, , strInhalt
Close #1
'strInhalt besitzt nun den Inhalt der Datei
'Zeilenumbrüche löschen
strInhalt = Replace(Replace(strInhalt, vbCr, ""), vbLf, "")
'Anfangs- und Endmarkierungen durch zwei identische Markierungen ersetzen
'hier kannst Du ggf. gleich das evtl. störenden Leerzeichen hinter der Anfangs-
'markierung löschen
strInhalt = Replace(Replace(strInhalt, "_$ANFANG$_ut ", "~~>#*#<~~"), "_$ENDE_", "~~>#*#<~~")
'den Inhalt in einzelne Teile teilen
strTeile = Split(strInhalt, "~~>#*#<~~")
'jedes ungerade Teilstück stand vorher zwischen Anfangs- und Endmarkierung
For i = 1 To UBound(strTeile) Step 2
    strErgebnis = strErgebnis & strTeile(i)
Next i
'und das wars auch schon.
MsgBox strErgebnis
End Sub


Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Abschnitte aus Textdateien auslesen / separier
17.03.2006 22:35:36
Jens
Hallo Micha,
mensch, das freut mich: erst eine so schnelle Antwort und dann funktioniert das auch noch so, wie ich es mir dachte.
MsgBox "Herzlichen Dank an Dich!"
Nun muss ich noch ein bisschen daran werkeln, dass er alle Dateien eines Verzeichnisses durchläuft und dann die gesammelten Werke - obwohl: Vielleicht hast du ne schnelle Lösung auch dafür? Du scheinst das ja recht schnell aus dem Ärmel zu schütteln.
Das weitere Ziel wäre also:
- Definiertes Ordnerverzeichnis auf der Festplatte angeben (z.B. C:\Beispielordner)
- Alle Dateien dieses Verzeichnisses
- C:\Beispielordner\datei-eins.txt
- C:\Beispielordner\datei-zwei.txt
- ...
- C:\Beispielordner\datei-hundertdreiunddreissig.txt
so durchlaufen wie wir es mit deinem Codeschnippsel gemacht haben und zwischenzeitlich immer die interessanten Abschnitte zwischen _$ANFANG$_ und _$_ENDE$_ in die Datei C:\Beispielordner\ergebnis.txt schreiben.
In dieser ergebnis.txt stünden also alle interessanten Abschnitte aus den einzelnen *.txt-Dateien im Ordner C:\Beispiel
Kannst du so was auch oder wäre das zu frech, dich auch noch darum zu bitten?
Ich bin immer noch begeistert von der ersten Antwort!
Vielleicht magst du dir ja obiges Problem noch einmal anschauen´.
DANKE SOWIESO schon mal!
jens
Anzeige
AW: Abschnitte aus Textdateien auslesen / separier
17.03.2006 22:41:30
MichaV
Hallo Jens,
geht gerade noch so ;o)
Ich gehe mal davon aus, dass keine Unterordner durchsucht werden.
Aber was heißt Datei-eins.txt, Datei-2.txt. Heissen die wirklich so? Woher soll XL die richtige Reihenfolge der einzulesenden Dateien kennen? Oder ist das egal?
Gruß- Micha
PS: Rückmeldung wäre nett.
AW: Abschnitte aus Textdateien auslesen / separier
17.03.2006 23:15:50
Jens
Hallo Micha,
Unterordner werden nicht durchsucht, ich hatte bei den Dateinamen einfach irgendetwas genommen. Die Namen sind nicht vorgegeben, es sollten lediglich schleifenweise alle Dateien eines definierten Verzeichnisses (C:\Beispiel\) durchsucht werden.
Ich habe es gerade auch schon einmal manuell mit deinem Code-Schnippsel für 43 Dateien gemacht, das ging natürlich auch, aber eleganter wäre noch der Weg per Verzeichnisdurchlauf.
Wenn du da ne Ahnung hast, kannst du ja mal probieren, ansonsten hast du mir auch schon so sehr, sehr geholfen und ich habe zu danken.
Ein Superforum hier!
Viele Grüsse
Jens
Anzeige
AW: Abschnitte aus Textdateien auslesen / separier
17.03.2006 23:46:23
MichaV
Hallo,
ja, tolles Forum.


Option Explicit
Sub alledateienimverzeichniseinlesenundteilezwischenanfangundendeextrahierenundindateischreiben()
Dim strDatei As String
Dim strInhalt As String
Dim strTeile() As String
Dim strErgebnis As String
Dim strAlleErgebnisse As String
Dim i As Integer
Const strWelcheDateien = "e:\micha\excel\*.txt"
Const strDeineErgebnisDatei = "e:\micha\excel\ergebnisse.txt"
'ersten Dateinamen ermittlen
strDatei = Dir(strWelcheDateien)
'alle offenen Dateien schließen
Close
Do
    'Datei in eine Variable einlesen
    Open strDatei For Binary As #1
    strInhalt = Space(LOF(1))
    Get #1, , strInhalt
    Close #1
    'strInhalt besitzt nun den Inhalt der Datei
    'Zeilenumbrüche löschen
    strInhalt = Replace(Replace(strInhalt, vbCr, ""), vbLf, "")
    'Anfangs- und Endmarkierungen durch zwei identische Markierungen ersetzen
    'hier kannst Du ggf. gleich das evtl. störenden Leerzeichen hinter der Anfangs-
    'markierung löschen
    strInhalt = Replace(Replace(strInhalt, "_$ANFANG$_ut ", Chr(0)), "_$ENDE_", Chr(0))
    'den Inhalt in einzelne Teile teilen
    strTeile = Split(strInhalt, Chr(0))
    'jedes ungerade Teilstück stand vorher zwischen Anfangs- und Endmarkierung
    For i = 1 To UBound(strTeile) Step 2
        strErgebnis = strErgebnis & strTeile(i)
    Next i
    'was gefunden? Wenn ja, in den Ergebnisstring schreiben
    If Len(strErgebnis) > 0 Then
        strAlleErgebnisse = strAlleErgebnisse & strErgebnis & vbCrLf
        strErgebnis = ""
    End If
    'nächsten Dateinamen ermitteln
    strDatei = Dir()
'Schleife so lange wiederholen, bis alle Dateien abgearbeitet
Loop Until strDatei = ""
If Len(strAlleErgebnisse) > 0 Then
    'letztes vbCrLf löschen
    strAlleErgebnisse = Mid(strAlleErgebnisse, 1, Len(strAlleErgebnisse) - 2)
    'Deine Ausgabe- Datei erstellen
    Open strDeineErgebnisDatei For Output As #1
    'oder for append, wenn alte Daten nicht überschrieben werden sollen
    'Daten reinschreiben, wieder schließen
    Print #1, strAlleErgebnisse;
    Close #1
Else
    MsgBox "Nix gefunden", vbCritical
End If
End Sub


Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige