brauseklaus
Goto Top

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.

Content-Key: 140422

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

Ausgedruckt am: 29.03.2024 um 10:03 Uhr

Mitglied: bastla
bastla 12.04.2010 um 22:57:54 Uhr
Goto Top
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).
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
Grüße
bastla
Mitglied: Brauseklaus
Brauseklaus 13.04.2010 um 00:16:16 Uhr
Goto Top
Hallo bastla!

Wow, Danke für die schnelle Antwort.

Das Programm scheint zwar durchzulaufen, aber trotz der "Fertig" -Meldung hat die Übertragung irgendwie nicht geklappt. Habe beides ausprobiert, mit Leerzeichen- oder TAB-Trennung. Für mich sieht es so aus, als ob die Zahlen mit Leerzeichen getrennt sind. Das heißt, die Ganzzahlen sind mit 9 und die Gebrochenen mit 1(bei negativen Werten) bzw. 2 (pos. Werte) Leerzeichen getrennt.

NORMALSTRESS und FLOWSTRESS kommen nur einmal im Dokument vor, der Begriff wird aber jeweils 5mal wiederholt.
Habe im Folgenden mal alle Leerzeichen durch Punkte ersetzt (die Punkte in den gebrochenen Zahlen sind selbstverständlich keine Leerzeichen ;)

...

NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
NORMALSTRESS
1.........1.........1.........0.........2.........1
1.........1.........1
..0.0000e+000
1.........3
.-8.9111e+000.-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

...

Grüße vom Brauseklaus
Mitglied: bastla
bastla 13.04.2010 um 00:25:57 Uhr
Goto Top
Hallo Brauseklaus!

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
und dem oben geposteten Code klappt das bei mir (Excel 2007) ...

Grüße
bastla
Mitglied: Brauseklaus
Brauseklaus 13.04.2010 um 00:49:22 Uhr
Goto Top
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 ;)

Noch eine Kleinigkeit: Gibt es eine kleine Zeile mit der ich die Punkte in Komma schon beim importieren umwandeln kann?

Also erstmal vielen Dank...
Mitglied: TsukiSan
TsukiSan 13.04.2010 um 04:38:47 Uhr
Goto Top
Hallo Brauseklaus

wenn du nach Bastlas Zeile (16)
Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen
diesen Code einfügst:
Satz = Replace( Satz , "." , "," )  
dann sollte dein Wunsch in Erfüllung gehen.

Ps.: @ Bastla
Sorry, möchte dir nicht vorgreifen!

Viele Grüße
Tsuki
Mitglied: Brauseklaus
Brauseklaus 13.04.2010 um 09:30:28 Uhr
Goto Top
Hallo TsukiSan

vielen Dank auch an Dich.

Das ist hier echt ein super Forum, danke Jungs.

Viele Grüße
Brauseklaus
Mitglied: bastla
bastla 13.04.2010 um 18:22:16 Uhr
Goto Top
@tsuki
Sorry, möchte dir nicht vorgreifen!
Das ist sehr höflich face-smile, 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 ... face-wink

Mein Ansatz
Satz = Replace(DateiEin.ReadLine, ".", ",") 'Datensatz aus Datei einlesen und dabei Punkte durch Kommata ersetzen
hätte zwar eine Zeile eingespart, sich aber ansonsten nicht wirklich von Deinem Vorschlag unterschieden.

Grüße
bastla
Mitglied: Biber
Biber 13.04.2010 um 19:00:04 Uhr
Goto Top
Moin Brauseklaus,

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 face-wink

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
Mitglied: Brauseklaus
Brauseklaus 13.04.2010 um 21:51:45 Uhr
Goto Top
Hi,

du hast völlig recht, hätte mir auch schon auffallen können ;/

Die Originaldatei ist genau doppelt so groß wie der Clone und hatte bevor ich diese mit dem Notepad geöffnet habe die Endung .unv.

Kann ich dieses Format auch direkt in Excel einlesen oder geht es tatsächlich nur über den Umweg: open with Notepad -> copy & paste ?

Sonst läuft der Code super, habe Ihn auch schon für andere Passagen in Benutz.

Eine Frage vielleicht noch zum Umgang mit den Leerzeichen. Da die Anzahl Dieser zwischen den benötigten Werten (im .txt) von Zeile zu Zeile schwankt und jedes Leerzeichen jetzt als eine ganze Leer-Spalte in Excel ausgegeben wird, sind die Werte teils stark versetzt.

Gibt es eine Möglichkeit, dass die Leerzeichenanzahl keine Einfluss auf die Leer-Spaltenanzahl in der Exceltabelle hat? Also z.B. standardmäßig nur eine leere Spalte zwischen den Werten.

Ich hoffe man versteht meine wirren Gedanken.........

Viele Grüße

Brauseklaus
Mitglied: Biber
Biber 13.04.2010 um 22:17:55 Uhr
Goto Top
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...face-wink

Grüße
Biber
[Edit] @bastla Und ich sach noch... face-wink
Menno, wenn du nicht mal Forumsmitgliedern mit einem so seriösen Nick und gewitzten Aussehen das altersgerechte Suchmaschinenfüttern zutraust - wem dann?
[/Edit]
Mitglied: bastla
bastla 13.04.2010 um 22:32:47 Uhr
Goto Top
@Biber
Ziemlich gute Schätzung (die Leerzeichengeschichte musste ja auch noch mit rein) ... face-wink

Die Änderung der Zeile 12 auf
Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0, 1) 'Textdatei im Unicode-Format öffnen
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:
Do While InStr(D, "  ") > 0 'solange es noch zwei aufeinanderfolgende Leerzeichen im Satz gibt ...  
    D = Replace(D, "  ", " ") ' ... diese durch ein einzelnes ersetzen  
Loop
Grüße
bastla
Mitglied: Brauseklaus
Brauseklaus 13.04.2010 um 22:36:32 Uhr
Goto Top
Hi Biber,

Ok, werde b) mal morgen testen.....

Habe mal zur Anschauung ein Stück der Ausgabe in Excel rauskopiert:

...


EDIT: klappt nicht, beim posten wird wieder alles geordnet ;(

...sehe gerade bastla hat seine wertvolle Freizeit geopfert.....

-schon mal Danke dafür-

werde morgen mal durchtesten

Viele Grüße

der Brause
Mitglied: bastla
bastla 13.04.2010 um 22:45:21 Uhr
Goto Top
Hallo Brauseklaus!

Um Beispieltext zu posten: ""-Formatierung verwenden

Grüße
bastla
Mitglied: TsukiSan
TsukiSan 14.04.2010 um 00:32:21 Uhr
Goto Top
und noch ein klitzekleiner Hinweis von mir.

mit der TRIM-Funktion bekommt man Leerzeichen/-felder auch weg.

So, jetzt mach' ich mich weg face-wink

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]
Mitglied: bastla
bastla 14.04.2010 um 00:39:19 Uhr
Goto Top
@tsuki
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
Daraus macht 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
Mitglied: TsukiSan
TsukiSan 14.04.2010 um 00:49:29 Uhr
Goto Top
@bastla,

wenn die Leerfelder dazwischen sind, dann hilft die Trim-Funktion natürlich nicht weiter.

Vielen Dank und viele Grüße

Tsuki
Mitglied: Brauseklaus
Brauseklaus 14.04.2010 um 09:57:44 Uhr
Goto Top
@bastla, du bist ein Gott!!!

Nun steht alles schön in Reih und Glied.

Für den Befehl zum verarbeiten des Unicodes musste ich lediglich ein Minus ergänzen.

Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0, -1)   

Vielen Dank für die nette Hilfe auch an TsukiSan und Biber.