Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Brauseklaus

Brauseklaus (Level 1) - Jetzt verbinden

12.04.2010 um 22:09 Uhr, 6983 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 ..
Ähnliche Inhalte
HTML
Textdokument in HTML einbauen
gelöst Frage von deinernstjetztHTML2 Kommentare

Hallo, ich möchte in HTML ein Textdokument für zb. AGB's einbauen. Das sollte in einem ca 200x200px Feld angezeigt ...

Batch & Shell
Datenbank in Textdokument?
gelöst Frage von IleiesBatch & Shell6 Kommentare

Ich habe folgendes Problem: Ich arbeite mit Batch und möchte eine Textdatei bearbeiten: C:\test.txt Marco ; Mustermann Annika ; ...

Microsoft Office

Word 2010: Druckeinstellungen pro Abschnitt

gelöst Frage von veniplexMicrosoft Office13 Kommentare

Hallo zusammen! kurze Frage: Ist es möglich in einem einzigen Word-Dokument für jeden Abschnitt individuelle Druckoptionen festzulegen? Wenn ja, ...

Windows Server

Verhindern, dass ein bestimmter Drucker als Standarddrucker definiert wird

gelöst Frage von sabinesWindows Server6 Kommentare

Moinsen, wir haben einen Drucker, der für spezielle Formate und Farben eingerichtet ist und auch nur von wenigen Berechtigten ...

Neue Wissensbeiträge
Windows 7
Updategängelung auf Windows 10, die zweite
Information von Penny.Cilin vor 1 TagWindows 7

Hallo, da Windows 7 im kommenden Jahr nicht mehr supportet wird, werden Nutzer von Window 7 home premium wieder ...

Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 3 TagenInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 4 TagenMicrosoft Office7 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 6 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Heiß diskutierte Inhalte
Notebook & Zubehör
Hardware defekt ?
Frage von mausemuckelNotebook & Zubehör14 Kommentare

Hallo und ein schönes Osterfest an alle. Ich benötige mal euer Schwarm wissen. Ich habe hier ein Notebook Lenovo ...

LAN, WAN, Wireless
Lancom und VLANs
Frage von TimmheLAN, WAN, Wireless11 Kommentare

Hallo an alle ich habe momentan ein sehr merkwürdiges problem bei dem ich nicht mehr weiter komme und hoffe ...

Virtualisierung
Unix System virtualisieren
Frage von BananenmeisterVirtualisierung10 Kommentare

Hallo Zusammen, Ich möchte gerne eine Virtualisierungs-Software auf meinem kleinen ML Server installieren um einige Unix Systeme zu virtualisieren. ...

Netzwerkmanagement
Konfiguration von IPv6 in einer Domäne mit DHCP
Frage von gnoovyNetzwerkmanagement9 Kommentare

Hi Zusammen, ich bin gerade etwas am verzweifeln. Ich habe eine Testumgebung aufgebaut, um mich in das Thema IPv6 ...