Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Definierten Abschnitt aus Textdokument in Excel importieren

Frage Microsoft Microsoft Office

Mitglied: Brauseklaus

Brauseklaus (Level 1) - Jetzt verbinden

12.04.2010 um 22:09 Uhr, 6629 Aufrufe, 17 Kommentare

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.
Mitglied: bastla
12.04.2010 um 22:57 Uhr
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).
01.
Sub Importieren() 
02.
Datei = "D:\Textdokument.txt" 
03.
Von = "NORMALSTRESS" 'ab Zeile mit diesem Inhalt importieren 
04.
Bis = "FLOWSTRESS" 'ab Zeile mit diesem Inhalt nicht mehr importieren 
05.
Trenn = " " 'Leerzeichen als Trennzeichen zwischen den Feldern 
06.
'Trenn = vbTab 'TAB als Trennzeichen zwischen den Feldern 
07.
 
08.
SpNr = 1 'Daten ab Spalte A ... 
09.
ZNr = 3 'der Zeile 3 eintragen 
10.
 
11.
 
12.
Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei) 'Textdatei öffnen 
13.
Fertig = False 'Schalter initialisieren 
14.
Import = False 'Schalter initialisieren 
15.
Do While Not DateiEin.AtEndOfStream And Not Fertig 
16.
    Satz = DateiEin.ReadLine 'Datensatz aus Datei einlesen 
17.
    If Import Then 'Satz ist zu importieren 
18.
        If InStr(Satz, Bis) = 0 Then 'Ende des Datenbereiches noch nicht erreicht 
19.
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen 
20.
            ZNr = ZNr + 1 'nächste Tabellenzeile 
21.
        Else 
22.
            Fertig = True 'Ende des vorgegebenen Bereiches - keine weiteren Daten einlesen 
23.
        End If 
24.
    Else 'bisher wurde nicht importiert - ... 
25.
        If InStr(Satz, Von) > 0 Then '... beginnt hier der Datenbereich? 
26.
            Import = True 'ja; ab jetzt Zeilen importieren 
27.
            SatzEintragen Satz, ZNr, SpNr 'eingelesenen Satz in Tabellenzeile ZNr ab Spalte SpNr eintragen 
28.
            ZNr = ZNr + 1 'nächste Tabellenzeile 
29.
        End If 
30.
    End If 
31.
Loop 
32.
DateiEin.Close 'Textdatei schließen 
33.
MsgBox "Fertig." 
34.
End Sub 
35.
 
36.
Sub SatzEintragen(D, Z, S) 
37.
Felder = Split(D) 'Zeile in Felder zerlegen 
38.
Cells(Z, S).Resize(1, UBound(Felder) + 1).Value = Felder 'in der Zeile Z die Spalten ab Spalte S mit den Feldwerten füllen 
39.
End Sub
Grüße
bastla
Bitte warten ..
Mitglied: Brauseklaus
13.04.2010 um 00:16 Uhr
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
Bitte warten ..
Mitglied: bastla
13.04.2010 um 00:25 Uhr
Hallo Brauseklaus!

Sorry - kann ich nicht nachvollziehen: Mit den folgenden Testdaten
01.
8.1453e-007 
02.
118754 1 
03.
4.4212e-006 
04.
118755 1 
05.
1.1165e-005 
06.
118756 1 
07.
0.0000e+000 
08.
118757 1 
09.
4.6391e-007 
10.
-1 
11.
-1 
12.
56 
13.
NORMALSTRESS 
14.
NORMALSTRESS 
15.
NORMALSTRESS 
16.
NORMALSTRESS 
17.
NORMALSTRESS 
18.
1 1 1 0 2 1 
19.
1 1 1 
20.
0.0000e+000 
21.
1 3 
22.
-8.9111e+001 -8.9111e+001 -8.9111e+001 
23.
2 3 
24.
0.0000e+000 0.0000e+000 0.0000e+000 
25.
3 3 
26.
0.0000e+000 0.0000e+000 0.0000e+000 
27.
4 3 
28.
-1.1836e+000 -1.1836e+000 -1.1836e+000 
29.
5 3 
30.
... 
31.
-1.2414e+000 -1.2414e+000 -1.2414e+000 
32.
11565 3 
33.
-4.0751e-001 -4.0751e-001 -4.0751e-001 
34.
11566 3 
35.
-1.8090e-001 -1.8090e-001 -1.8090e-001 
36.
-1 
37.
-1 
38.
56 
39.
FLOWSTRESS 
40.
FLOWSTRESS 
41.
FLOWSTRESS 
42.
FLOWSTRESS 
43.
FLOWSTRESS 
44.
1 1 1 0 2 1 
45.
1 1 1 
46.
0.0000e+000 
47.
1 3 
48.
0.0000e+000 0.0000e+000 0.0000e+000 
49.
2 3 
50.
0.0000e+000 0.0000e+000 0.0000e+000
und dem oben geposteten Code klappt das bei mir (Excel 2007) ...

Grüße
bastla
Bitte warten ..
Mitglied: Brauseklaus
13.04.2010 um 00:49 Uhr
....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...
Bitte warten ..
Mitglied: TsukiSan
13.04.2010 um 04:38 Uhr
Hallo Brauseklaus

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

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

Viele Grüße
Tsuki
Bitte warten ..
Mitglied: Brauseklaus
13.04.2010 um 09:30 Uhr
Hallo TsukiSan

vielen Dank auch an Dich.

Das ist hier echt ein super Forum, danke Jungs.

Viele Grüße
Brauseklaus
Bitte warten ..
Mitglied: bastla
13.04.2010 um 18:22 Uhr
@Tsuki
Sorry, möchte dir nicht vorgreifen!
Das ist sehr höflich , 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
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
Bitte warten ..
Mitglied: Biber
13.04.2010 um 19:00 Uhr
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

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
Bitte warten ..
Mitglied: Brauseklaus
13.04.2010 um 21:51 Uhr
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
Bitte warten ..
Mitglied: Biber
13.04.2010 um 22:17 Uhr
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]
Bitte warten ..
Mitglied: bastla
13.04.2010 um 22:32 Uhr
@Biber
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
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:
01.
Do While InStr(D, "  ") > 0 'solange es noch zwei aufeinanderfolgende Leerzeichen im Satz gibt ... 
02.
    D = Replace(D, "  ", " ") ' ... diese durch ein einzelnes ersetzen 
03.
Loop
Grüße
bastla
Bitte warten ..
Mitglied: Brauseklaus
13.04.2010 um 22:36 Uhr
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
Bitte warten ..
Mitglied: bastla
13.04.2010 um 22:45 Uhr
Hallo Brauseklaus!

Um Beispieltext zu posten: "Code"-Formatierung verwenden

Grüße
bastla
Bitte warten ..
Mitglied: TsukiSan
14.04.2010 um 00:32 Uhr
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]
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]
Bitte warten ..
Mitglied: bastla
14.04.2010 um 00:39 Uhr
@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
Bitte warten ..
Mitglied: TsukiSan
14.04.2010 um 00:49 Uhr
@bastla,

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

Vielen Dank und viele Grüße

Tsuki
Bitte warten ..
Mitglied: Brauseklaus
14.04.2010 um 09:57 Uhr
@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.

01.
Set DateiEin = CreateObject("Scripting.FileSystemObject").OpenTextFile(Datei, 1, 0, -1) 
Vielen Dank für die nette Hilfe auch an TsukiSan und Biber.
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(2)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
CSV-Datei nach Excel importieren (5)

Frage von mrvfbnummer2 zum Thema Batch & Shell ...

Microsoft Office
gelöst Txt Dateien in Excel importieren (9)

Frage von Serbitar zum Thema Microsoft Office ...

VB for Applications
Bestimmte Daten aus eine CSV-Datei in eine Excel-Tabelle importieren (2)

Frage von MariaElena zum Thema VB for Applications ...

Outlook & Mail
Importieren von excel daten in outlook vba - Teil 2 (5)

Frage von Bgervais zum Thema Outlook & Mail ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...