Definierten Abschnitt aus Textdokument in Excel importieren
Hallo
Ich fange gerade an mich ein wenig mit den Makro-Funktionen von Excel 2003 bzw. 2007 vertraut zu machen. Leider sind meine Programmierkenntnisse sehr bescheiden, sodass auch ein ausgiebiges durchforsten sämtlicher Foren mir nicht weiterhelfen konnte.
Folgendes Problem ist zu lösen:
Aus einem großen Textdokument ca. 1,5 Mio. Zeilen, welches verschiedene Messwerte und andere Parameter enthält, möchte ich gezielt gewisse Passagen auslesen und in eine Excel-Tabelle importieren, um sie dort weiter auswerten zu können.
Kleiner Ausschnitt:
...
8.1453e-007
118754 1
4.4212e-006
118755 1
1.1165e-005
118756 1
0.0000e+000
118757 1
4.6391e-007
-1
-1
56
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
1 1 1 0 2 1
1 1 1
0.0000e+000
1 3
-8.9111e+001 -8.9111e+001 -8.9111e+001
2 3
0.0000e+000 0.0000e+000 0.0000e+000
3 3
0.0000e+000 0.0000e+000 0.0000e+000
4 3
-1.1836e+000 -1.1836e+000 -1.1836e+000
5 3
...
-1.2414e+000 -1.2414e+000 -1.2414e+000
11565 3
-4.0751e-001 -4.0751e-001 -4.0751e-001
11566 3
-1.8090e-001 -1.8090e-001 -1.8090e-001
-1
-1
56
FLOWSTRESS
FLOWSTRESS
FLOWSTRESS
FLOWSTRESS
FLOWSTRESS
1 1 1 0 2 1
1 1 1
0.0000e+000
1 3
0.0000e+000 0.0000e+000 0.0000e+000
2 3
0.0000e+000 0.0000e+000 0.0000e+000
...
usw. usw.
Gibt es eine elegante Lösung, um jetzt beispielsweise sämtliche Normalspannungen (NORMALSTRESS) in Excel zu importieren? Also im Prinzip alle Werte zwischen NORMALSTRESS und FLOWSTRESS.
Schon einmal vielen Dank im Voraus.
Ich fange gerade an mich ein wenig mit den Makro-Funktionen von Excel 2003 bzw. 2007 vertraut zu machen. Leider sind meine Programmierkenntnisse sehr bescheiden, sodass auch ein ausgiebiges durchforsten sämtlicher Foren mir nicht weiterhelfen konnte.
Folgendes Problem ist zu lösen:
Aus einem großen Textdokument ca. 1,5 Mio. Zeilen, welches verschiedene Messwerte und andere Parameter enthält, möchte ich gezielt gewisse Passagen auslesen und in eine Excel-Tabelle importieren, um sie dort weiter auswerten zu können.
Kleiner Ausschnitt:
...
8.1453e-007
118754 1
4.4212e-006
118755 1
1.1165e-005
118756 1
0.0000e+000
118757 1
4.6391e-007
-1
-1
56
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
1 1 1 0 2 1
1 1 1
0.0000e+000
1 3
-8.9111e+001 -8.9111e+001 -8.9111e+001
2 3
0.0000e+000 0.0000e+000 0.0000e+000
3 3
0.0000e+000 0.0000e+000 0.0000e+000
4 3
-1.1836e+000 -1.1836e+000 -1.1836e+000
5 3
...
-1.2414e+000 -1.2414e+000 -1.2414e+000
11565 3
-4.0751e-001 -4.0751e-001 -4.0751e-001
11566 3
-1.8090e-001 -1.8090e-001 -1.8090e-001
-1
-1
56
FLOWSTRESS
FLOWSTRESS
FLOWSTRESS
FLOWSTRESS
FLOWSTRESS
1 1 1 0 2 1
1 1 1
0.0000e+000
1 3
0.0000e+000 0.0000e+000 0.0000e+000
2 3
0.0000e+000 0.0000e+000 0.0000e+000
...
usw. usw.
Gibt es eine elegante Lösung, um jetzt beispielsweise sämtliche Normalspannungen (NORMALSTRESS) in Excel zu importieren? Also im Prinzip alle Werte zwischen NORMALSTRESS und FLOWSTRESS.
Schon einmal vielen Dank im Voraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 140422
Url: https://administrator.de/forum/definierten-abschnitt-aus-textdokument-in-excel-importieren-140422.html
Ausgedruckt am: 22.04.2025 um 09:04 Uhr
17 Kommentare
Neuester Kommentar
Hallo Brauseklaus!
Die Struktur der Daten ist mir nicht so ganz klar - ich unterstelle daher, dass jede Zeile deiner Beispieldaten einen Datensatz aus ein oder mehreren Feldern darstellt, wobei die Felder durch Leerzeichen getrennt sind (sollte die Trennung zB durch TAB erfolgen, so müsste nur der Apostroph am Beginn der Zeile 6 entfernt werden, um diese zu verwenden - Zeile 5 würde damit überflüssig).
Alle Zeilen ab dem ersten Auftreten von "NORMALSTRESS" bis zum ersten Auftreten von "FLOWSTRESS" (jeweils an beliebiger Position innerhalb der Zeile) werden in die beim Start des Makros aktuelle Exceltabelle (die Eintragung in die Tabelle beginnt im Beispiel bei der Zelle A3) geschrieben, wobei für Zeilen mit mehreren Feldern eine Aufteilung des Satzes auf Spalten erfolgt.
Es wird unterstellt, dass es nur einen Bereich "NORMALSTRESS" bis "FLOWSTRESS" in der Datei gibt, sodass ab der ersten "FLOWSTRESS"-Zeile das Einlesen beendet werden kann (es sei denn, es wäre noch gar nicht mit dem Einlesen begonen worden).
Grüße
bastla
Die Struktur der Daten ist mir nicht so ganz klar - ich unterstelle daher, dass jede Zeile deiner Beispieldaten einen Datensatz aus ein oder mehreren Feldern darstellt, wobei die Felder durch Leerzeichen getrennt sind (sollte die Trennung zB durch TAB erfolgen, so müsste nur der Apostroph am Beginn der Zeile 6 entfernt werden, um diese zu verwenden - Zeile 5 würde damit überflüssig).
Alle Zeilen ab dem ersten Auftreten von "NORMALSTRESS" bis zum ersten Auftreten von "FLOWSTRESS" (jeweils an beliebiger Position innerhalb der Zeile) werden in die beim Start des Makros aktuelle Exceltabelle (die Eintragung in die Tabelle beginnt im Beispiel bei der Zelle A3) geschrieben, wobei für Zeilen mit mehreren Feldern eine Aufteilung des Satzes auf Spalten erfolgt.
Es wird unterstellt, dass es nur einen Bereich "NORMALSTRESS" bis "FLOWSTRESS" in der Datei gibt, sodass ab der ersten "FLOWSTRESS"-Zeile das Einlesen beendet werden kann (es sei denn, es wäre noch gar nicht mit dem Einlesen begonen worden).
Sub Importieren()
Datei = "D:\Textdokument.txt"
Von = "NORMALSTRESS" 'ab Zeile mit diesem Inhalt importieren
Bis = "FLOWSTRESS" 'ab Zeile mit diesem Inhalt nicht mehr importieren
Trenn = " " 'Leerzeichen als Trennzeichen zwischen den Feldern
'Trenn = vbTab 'TAB als Trennzeichen zwischen den Feldern
SpNr = 1 'Daten ab Spalte A ...
ZNr = 3 'der Zeile 3 eintragen
Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei) 'Textdatei öffnen
Fertig = False 'Schalter initialisieren
Import = False 'Schalter initialisieren
Do While Not DateiEin.AtEndOfStream And Not Fertig
Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen
If Import Then 'Satz ist zu importieren
If InStr(Satz, Bis) = 0 Then 'Ende des Datenbereiches noch nicht erreicht
SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen
ZNr = ZNr + 1 'nächste Tabellenzeile
Else
Fertig = True 'Ende des vorgegebenen Bereiches - keine weiteren Daten einlesen
End If
Else 'bisher wurde nicht importiert - ...
If InStr(Satz, Von) > 0 Then '... beginnt hier der Datenbereich?
Import = True 'ja; ab jetzt Zeilen importieren
SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen
ZNr = ZNr + 1 'nächste Tabellenzeile
End If
End If
Loop
DateiEin.Close 'Textdatei schließen
MsgBox "Fertig."
End Sub
Sub SatzEintragen(D, Z, S)
Felder = Split(D) 'Zeile in Felder zerlegen
Cells(Z, S).Resize(1, UBound(Felder) + 1).Value = Felder 'in der Zeile Z die Spalten ab Spalte S mit den Feldwerten füllen
End Sub
bastla
Hallo Brauseklaus!
Sorry - kann ich nicht nachvollziehen: Mit den folgenden Testdaten
und dem oben geposteten Code klappt das bei mir (Excel 2007) ...
Grüße
bastla
Sorry - kann ich nicht nachvollziehen: Mit den folgenden Testdaten
8.1453e-007
118754 1
4.4212e-006
118755 1
1.1165e-005
118756 1
0.0000e+000
118757 1
4.6391e-007
-1
-1
56
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
1 1 1 0 2 1
1 1 1
0.0000e+000
1 3
-8.9111e+001 -8.9111e+001 -8.9111e+001
2 3
0.0000e+000 0.0000e+000 0.0000e+000
3 3
0.0000e+000 0.0000e+000 0.0000e+000
4 3
-1.1836e+000 -1.1836e+000 -1.1836e+000
5 3
...
-1.2414e+000 -1.2414e+000 -1.2414e+000
11565 3
-4.0751e-001 -4.0751e-001 -4.0751e-001
11566 3
-1.8090e-001 -1.8090e-001 -1.8090e-001
-1
-1
56
FLOWSTRESS
FLOWSTRESS
FLOWSTRESS
FLOWSTRESS
FLOWSTRESS
1 1 1 0 2 1
1 1 1
0.0000e+000
1 3
0.0000e+000 0.0000e+000 0.0000e+000
2 3
0.0000e+000 0.0000e+000 0.0000e+000
Grüße
bastla
@tsuki
, aber wirklich nicht nötig - abgesehen davon, dass wir ja alle anstreben, Hilfe möglichst rasch anzubieten, kenne ich selbst ja in dieser Hinsicht auch keine falsche Zurückhaltung ... 
Mein Ansatz
hätte zwar eine Zeile eingespart, sich aber ansonsten nicht wirklich von Deinem Vorschlag unterschieden.
Grüße
bastla
Sorry, möchte dir nicht vorgreifen!
Das ist sehr höflich Mein Ansatz
Satz = Replace(DateiEin.ReadLine, ".", ",") 'Datensatz aus Datei einlesen und dabei Punkte durch Kommata ersetzen
Grüße
bastla
Moin Brauseklaus,
auch wenn deine Frage schon gelöst markiert ist...

Möglicherweise ist es ja eine Unicode-(Text-)Datei, die du mit deinem ungenannten Copy&Paste-Werkzeug on the fly (und unbeabsichtigt) für bastlas Schnipsel gangbar machst.
Kannst du mal bitte die Dateigrößen Original-Datei vs. dein Copy-Paste-Clone vergleichen und das Ergebnis mitteilen?
Grüße
Biber
auch wenn deine Frage schon gelöst markiert ist...
Zitat von @Brauseklaus:
merkwürdig, wenn ich mir ein kleines Textdokument selbst erstell, läuft es bei mir auch...(Excel 2007)
EDIT: Selbst wenn ich den gesamten Inhalt der Datei in eine andere kopiere läuft es. Zur Not muss ich dann diesen Weg nehmen
Dieser letzte Satz lässt in mir den Verdacht keimen, diese Text-Datei könnte eventuell ein Nicht-Windows-Standard-Plaintext-Format haben merkwürdig, wenn ich mir ein kleines Textdokument selbst erstell, läuft es bei mir auch...(Excel 2007)
EDIT: Selbst wenn ich den gesamten Inhalt der Datei in eine andere kopiere läuft es. Zur Not muss ich dann diesen Weg nehmen
Möglicherweise ist es ja eine Unicode-(Text-)Datei, die du mit deinem ungenannten Copy&Paste-Werkzeug on the fly (und unbeabsichtigt) für bastlas Schnipsel gangbar machst.
Kannst du mal bitte die Dateigrößen Original-Datei vs. dein Copy-Paste-Clone vergleichen und das Ergebnis mitteilen?
Grüße
Biber
Moin Brauseklaus,
klar kannst du dir den Schlenker über Notepad und Copy&Paste auch wegautomatisieren.
Dazu entweder
a) 10 Minuten warten - dann haben es es Tsuki und/oder bastlaSan mundgerecht gepostet
-oder-
b) mal eine handelsübliche Suchmaschine füttern mit "FileScriptingObject OpenTextFile Unicode" und Enter drücken.und im Script die betreffende Zeile um einen Parameter erweitern.
Die andere Frage mit den Leerzeichen, die irgendwie nicht so recht automatisiert verarbeitet werden wollen.... äh ja, die muss ich erst in Ruhe nachhallen lassen.
kommt wirklich etwas wirr rüber...
Grüße
Biber
[Edit] @bastla Und ich sach noch...
Menno, wenn du nicht mal Forumsmitgliedern mit einem so seriösen Nick und gewitzten Aussehen das altersgerechte Suchmaschinenfüttern zutraust - wem dann?
[/Edit]
klar kannst du dir den Schlenker über Notepad und Copy&Paste auch wegautomatisieren.
Dazu entweder
a) 10 Minuten warten - dann haben es es Tsuki und/oder bastlaSan mundgerecht gepostet
-oder-
b) mal eine handelsübliche Suchmaschine füttern mit "FileScriptingObject OpenTextFile Unicode" und Enter drücken.und im Script die betreffende Zeile um einen Parameter erweitern.
Die andere Frage mit den Leerzeichen, die irgendwie nicht so recht automatisiert verarbeitet werden wollen.... äh ja, die muss ich erst in Ruhe nachhallen lassen.
kommt wirklich etwas wirr rüber...
Grüße
Biber
[Edit] @bastla Und ich sach noch...
Menno, wenn du nicht mal Forumsmitgliedern mit einem so seriösen Nick und gewitzten Aussehen das altersgerechte Suchmaschinenfüttern zutraust - wem dann?
[/Edit]
@Biber
Ziemlich gute Schätzung (die Leerzeichengeschichte musste ja auch noch mit rein) ...
Die Änderung der Zeile 12 auf
wird hoffentlich ermöglichen, die Datei direkt zu verarbeiten.
Die Anzahl der Leerspalten sollte sich durch folgende (allerdings ungetestete) Ergänzung (einzufügen vor Zeile 37, also: Felder = Split(D) 'Zeile in Felder zerlegen ) reduzieren lassen:
Grüße
bastla
Ziemlich gute Schätzung (die Leerzeichengeschichte musste ja auch noch mit rein) ...
Die Änderung der Zeile 12 auf
Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0, 1) 'Textdatei im Unicode-Format öffnen
Die Anzahl der Leerspalten sollte sich durch folgende (allerdings ungetestete) Ergänzung (einzufügen vor Zeile 37, also: Felder = Split(D) 'Zeile in Felder zerlegen ) reduzieren lassen:
Do While InStr(D, " ") > 0 'solange es noch zwei aufeinanderfolgende Leerzeichen im Satz gibt ...
D = Replace(D, " ", " ") ' ... diese durch ein einzelnes ersetzen
Loop
bastla
und noch ein klitzekleiner Hinweis von mir.
mit der TRIM-Funktion bekommt man Leerzeichen/-felder auch weg.
So, jetzt mach' ich mich weg
Gruss und danke!
Tsuki
[Edit]
[/Edit]
mit der TRIM-Funktion bekommt man Leerzeichen/-felder auch weg.
So, jetzt mach' ich mich weg
Gruss und danke!
Tsuki
[Edit]
a) 10 Minuten warten - dann haben es es Tsuki und/oder bastlaSan mundgerecht gepostet
Danke für die Blumen, aber die hat bastla verdient!!!![/Edit]
@tsuki
Das Problem dürften hier allerdings nicht die Leerzeichen an den "Rändern" - und nur dort wirkt
Daraus macht
Grüße
bastla
Das Problem dürften hier allerdings nicht die Leerzeichen an den "Rändern" - und nur dort wirkt
Trim()
- sein, sondern überzählige zwischen den Feldern - etwa so:5 3
Split()
dann tatsächlich insgesamt 7 Spalten, da jedes Leerzeichen als Trennzeichen (und wenn gleich nix dazwischen steht, was zu trennen wäre) interpretiert wird.Grüße
bastla
@bastla,
wenn die Leerfelder dazwischen sind, dann hilft die Trim-Funktion natürlich nicht weiter.
Vielen Dank und viele Grüße
Tsuki
wenn die Leerfelder dazwischen sind, dann hilft die Trim-Funktion natürlich nicht weiter.
Vielen Dank und viele Grüße
Tsuki