Autor
|
Thema: Imprtieren von bestimmten Werten aus txt.Datei (3645 mal gelesen)
|
jonnyw79 Mitglied Student
Beiträge: 67 Registriert: 18.11.2005
|
erstellt am: 17. Jul. 2006 11:32 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich schreibe gerade an meiner Diplomarbeit und stehe vor der Aufgabe bestimmte Werte (Zahlenwerte) aus einer bzw. mehreren txt-Dateien in Excel zu importieren (Es soll also eine lästige Eingabe der vielen Zahlenwerte vermieden werden!). In Excel soll dann mit diesen Zahlenwerten weitergerechnet werden. Da jedoch die txt. Dateien automatisch von einem CAD Programm erzeugt werden, beinhalten sie nicht nur die erforderlichen Werte, sondern auch viel unnötigen Text. Jetzt zu meiner Frage: Kann ich über ein Makro/Basicprogramm erreichen, dass nur die von mir erforderlichen Zahlenwerte importiert werden? Die Werte sehen wie folgt aus: VOLUMEN = 6.1902283e+05 MM^3 FLÄCHENINHALT = 7.0004400e+04 MM^2 MITTLERE DICHTE = 7.8500000e-06 KILOGRAMM / MM^3 MASSE = 4.8593292e+00 KILOGRAMM Ich bräuchte also nur die Zahlenwerte für Volumen etc. Vielen Dank für Eure Hilfe!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Teddibaer Ehrenmitglied V.I.P. h.c. Struktur-Experte
Beiträge: 2125 Registriert: 09.02.2004 **CSWP 06/2004** -- MacBook Air M1 MacBook Pro M1-Max
|
erstellt am: 17. Jul. 2006 11:40 <-- editieren / zitieren --> Unities abgeben: Nur für jonnyw79
|
heiko_hems Mitglied Freier Architekt
Beiträge: 1295 Registriert: 14.01.2005
|
erstellt am: 17. Jul. 2006 12:18 <-- editieren / zitieren --> Unities abgeben: Nur für jonnyw79
Hi jonnyw, und herzlich willkommen ... Ich würde den Ansatz von Teddibär teilen, aber deine Quelle ist ein bisschen chaotisch. Stehen nach den Zahlen wirklich teilweise 2 Leerzeichen vor der Einheit ? Wenn nicht dann sollte es über Daten>TextinSpalten ganz brauchbar funktionieren (s.Anlage, einfach .txt löschen). Gruß Heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 17. Jul. 2006 12:19 <-- editieren / zitieren --> Unities abgeben: Nur für jonnyw79
Hallo, wie importierst Du denn die txt? Ganz normal über "öffnen" -> alle Dateien (*.*)? Dann gibt es doch diesen Konvertierungsassistenten (s. Bildchen) bei, da kann man sagen, daß die Werte "Leerzeichen-getrennt" sind. Als nächsten Schritt läßt man sich nur die Spalten mit den Zahlen einlesen. Zum Schluß dann in Excel die Zellen als Zahl formatieren. Wenn's nicht zuviele sind, händisch, sonst mal Makro versuchen (mit Rekorder kommt bißchen was, dann anpassen) HTH Nicole ------------------ Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jonnyw79 Mitglied Student
Beiträge: 67 Registriert: 18.11.2005
|
erstellt am: 17. Jul. 2006 13:26 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank schonmal an Alle!!! Habt mir schon etwas weitergeholfen! Allerdings ist das noch nicht ganz die Lösung. Vieleicht kam meine Frage eben nicht so richtig rüber. Ich versuchs einfach nochmal: Habe mehrere Textdateien vorliegen, die alle bis auf die Zahlenwerte gleich aussehen (Volumen, Flächeninhalt usw.). Diese sollen jetzt in Excel zur weiteren Nutzung importiert werden. Von diesen Dateien brauche jedoch nicht alle Daten, sondern nur einige. Z.B. nur den Flächeninhalt und die Mittlere Dichte. Den Rest der Spalte brauch ich nicht. VOLUMEN = 6.1902283e+05 MM^3 FLÄCHENINHALT = 7.0004400e+04 MM^2 MITTLERE DICHTE = 7.8500000e-06 KILOGRAMM / MM^3 MASSE = 4.8593292e+00 KILOGRAMM Da dieser Import ständig vorkommt, soll er weitgehend automatisiert werden. Will heißen aus allen vorhandenen txt.Dateien sollen wenn möglich auf Knopfdruck z.B nur die Daten von Flächeninhalt und Mittlere Dichte herausgelesen werden. (Natürlich könnte man aus den vielen txt. Dateien auch eine grosse mit allen Daten machen, falls das irgendwie hilft.) Die Auswahl der Daten ändert sich im späteren Verlauf nicht mehr. Es werden also immer nur Flächeninhalt und Mittlere Dichte importiert. Nach euren Lösungsvorschlägen wird aber immer die komplette Spalte mit allen nicht benötigten Daten importiert. Oder kann ich das sonst wie noch bestimmen? Und ich müsste die jeweilige Trennung der Daten in dem Importdialog immer jedesmal von Hand durchführen. Gibt es keine Möglichkeit da irgendein Visual Basic Makro zu programmieren? Wie mache ich das am besten? Hab zwar etwas Erfahrung im Programmieren jedoch nicht mit Visual Basic. Danke für eure Mühe!
Gruss Jonnyw79 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 17. Jul. 2006 15:54 <-- editieren / zitieren --> Unities abgeben: Nur für jonnyw79
Hallo, Du sprichst von Spalten. Stehen die Daten in der Textdatei denn nebeneinander ? Wenn ja, welches Trennzeichen ? Oder stehen sie untereinander ? Dann versuche mal sowas. CU, Bernd --
Code: Option ExplicitConst StartPfad = "E:\TEST\" ' MIT \ am ENDE ! Dim objRegExp As Object, objMatchCollection As Object Function ReadValues(ByVal strFname As String, ByRef dblFlaeche As Double, ByRef dblDichte As Double) As Boolean Dim intHandle As Integer Dim strOneLine As String ReadValues = False intHandle = FreeFile Open strFname For Input As #intHandle While Not EOF(intHandle) Line Input #intHandle, strOneLine Set objMatchCollection = objRegExp.Execute(strOneLine) If objMatchCollection.Count Then With objMatchCollection(0) ReadValues = True If UCase(.SubMatches(0)) = "FLÄCHENINHALT" Then dblFlaeche = Val(.SubMatches(1)) ElseIf UCase(.SubMatches(0)) = "MITTLERE DICHTE" Then dblDichte = Val(.SubMatches(1)) End If End With End If Set objMatchCollection = Nothing Wend Close #intHandle End Function Sub ReadAllValues() Dim strName As String, dblFlaeche As Double, dblDichte As Double Set objRegExp = CreateObject("vbscript.regexp") objRegExp.Pattern = "^ *(FLÄCHENINHALT|MITTLERE DICHTE) *= *(\d+\.\d*E[-+]\d+)" objRegExp.IgnoreCase = True strName = Dir(StartPfad & "*.txt") While strName <> "" If ReadValues(StartPfad & strName, dblFlaeche, dblDichte) = True Then Debug.Print strName, dblFlaeche, dblDichte Else Debug.Print strName, "Kein Eintrag!" End If strName = Dir Wend Set objRegExp = Nothing End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
U_Suess Ehrenmitglied V.I.P. h.c. CAD-Admin / manchmal Konstrukteur
Beiträge: 10560 Registriert: 14.11.2001 Windows 7 Excel 2010
|
erstellt am: 17. Jul. 2006 16:08 <-- editieren / zitieren --> Unities abgeben: Nur für jonnyw79
Vielleicht sollte der Fragesteller mal überlegen, ob es nicht besser ist, im Ausgangssystem schon ordentliche Daten zu generieren. Da es sich IMHO um die Massenberechnungsdateien von Pro/E handelt, kann er die Werte aus der Datei der übergeordneten Baugruppe herausnehmen. Oder er nimmt den Umweg über eine Zeichnung mit einer Tabelle mit Wiederholbereich und gibt diese als *.txt aus. (Nähere Erläuterungen bekommst man dann im Pro/E-Forum.) ------------------ Gruß Udo Keine Panik, Du arbeitest mit Pro/E! Und Du hast cad.de gefunden! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 17. Jul. 2006 16:16 <-- editieren / zitieren --> Unities abgeben: Nur für jonnyw79
So, schön ist wie immer bei mir anders, aber vielleicht tut's ja schon.. Vorgehensweise:1. meine Datei speichern. 2. Datei: ImportierteTexte.xls anlegen. 3. Die Textdateien müssen immer gleich aufgebaut sein!! 4. meine Datei öffnen und Makro "TexteImportieren" ausführen 5. Dialog folgen, heißt: zu öffnende Datei auswählen, falls bei Dateityp noch nicht vorbelegt: "Textdateien" angeben, Dialog der Konvertierung einfach mit "Fertigstellen" schließen. 6. Überschreibwarnung der ImportierteTexte-Datei mit "ja" bestätigen 7. Datei ImportierteTexte schließen 8. Datei Import. txt nicht die .xls! schließen (Änderungen nicht speichern) 9. In meiner Datei erneut das Makro ausführen und folglich ab Schritt 5 alles wie gehabt. Ergebnis: In der Datei Importierte Texte werden nach und nach alle Texte unten angehängt, ohne zwischenzeilen oder sonstigen Schnack. Ich weiß, daß bei dieser Lösung durchaus noch viel "Luft nach oben" ist, speziell im unteren Teil aber besser krieg ich's grad nich hin Gruß, Nicole
------------------ Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jonnyw79 Mitglied Student
Beiträge: 67 Registriert: 18.11.2005
|
erstellt am: 13. Sep. 2006 10:39 <-- editieren / zitieren --> Unities abgeben:
@ bst Hallo dein Programmcode funktioniert soweit ganz gut!! Vielen Dank!! Hab aber noch ein kleines Problem. In einer Zeile meiner txt-Datei steht folgendes: X Y Z -5.8436909e+01 -3.3615436e+01 -4.4806354e+02 MM nun soll der Wert -5.8436909e+01 als X, -3.3615436e+01 als Y und -4.4806354e+02 als Z ausgelesen werden. Wie kann ich das Anstellen? Kann ich als Trennzeichen eine Leerstelle angeben? Vielen Dank schonmal! Gruss jonnyw79 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 13. Sep. 2006 13:51 <-- editieren / zitieren --> Unities abgeben: Nur für jonnyw79
|
jonnyw79 Mitglied Student
Beiträge: 67 Registriert: 18.11.2005
|
erstellt am: 13. Sep. 2006 14:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd! Die Zahlenwerte FÜR X Y und Z sollen noch zusätzlich zu MITTLERE DICHTE und FLÄCHENINHALT ausgelesen werden. Dabei sind alle txt-Dateien immer gleich aufgebaut: VOLUMEN = 3.8004337e+05 MM^3 FLÄCHENINHALT = 4.9801329e+04 MM^2 MITTLERE DICHTE = 7.8500000e-06 KILOGRAMM / MM^3 MASSE = 2.9833405e+00 KILOGRAMM SCHWERPUNKT in Bezug auf den Koordinatenrahmen _DC_MDEG_77L: X Y Z -1.5210928e+01 -5.6813123e-02 6.8168146e-02 MM d.h.: die Bezeichnung "X Y Z" ist immer gleich. Lediglich die Werte selbst sind unterschiedlich. Dabei sind die Stellenanzahl der Werte auch immer gleich. Der einzige Unterschied besteht darin, dass manche Werte ein positives bzw. negatives Vorzeichen haben. Das Vorzeichen befindet sich aber auch immer an der gleichen Stelle. (Bei positiven Werten sind halt zwei Leerstellen zwischen den Werten. Bei negativen nur eine) Hoffe ich konnte deine Frage damit klären. Gruss Jonnyw79 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 13. Sep. 2006 14:35 <-- editieren / zitieren --> Unities abgeben: Nur für jonnyw79
Hi jonnyw79, versuch's mal so. Vielleicht wäre es hier vorzuziehen 2 Mal zu suchen, da die beiden zu suchenden Ausdrücke doch sehr unterschiedlich sind. Und dadurch das Suchmuster ziemlich kompliziert wird. CU, Bernd --
Code:
Option ExplicitConst StartPfad = "E:\TEST\" ' MIT \ am ENDE ! Dim objRegExp As Object, objMatchCollection As Object Type tInputData Flaeche As Double Dichte As Double X As Double Y As Double Z As Double End Type Function ReadValues(ByVal strFname As String, ByRef inp As tInputData) As Boolean Dim intHandle As Integer Dim strOneLine As String ReadValues = False intHandle = FreeFile Open strFname For Input As #intHandle While Not EOF(intHandle) Line Input #intHandle, strOneLine Set objMatchCollection = objRegExp.Execute(strOneLine) If objMatchCollection.Count Then With objMatchCollection(0) ReadValues = True If UCase(.SubMatches(0)) = "FLÄCHENINHALT" Then inp.Flaeche = Val(.SubMatches(1)) ElseIf UCase(.SubMatches(0)) = "MITTLERE DICHTE" Then inp.Dichte = Val(.SubMatches(1)) Else inp.X = Val(.SubMatches(3)) inp.Y = Val(.SubMatches(4)) inp.Z = Val(.SubMatches(5)) End If End With End If Set objMatchCollection = Nothing Wend Close #intHandle End Function Sub ReadAllValues() Dim strName As String, inp As tInputData Dim strZahl As String strZahl = "((?:[+-] *)?\d+\.\d*E[-+]\d+)" Set objRegExp = CreateObject("vbscript.regexp") objRegExp.Pattern = "^ *(? :(FLÄCHENINHALT|MITTLERE DICHTE) *= *" & strZahl & ")|(X +Y +Z +)" & _ strZahl & " +" & strZahl & " +" & strZahl objRegExp.IgnoreCase = True strName = Dir(StartPfad & "*.txt") While strName <> "" inp.Dichte = 0: inp.Flaeche = 0: inp.X = 0: inp.Y = 0: inp.Z = 0 If ReadValues(StartPfad & strName, inp) = True Then Debug.Print strName, inp.Flaeche, inp.Dichte, inp.X, inp.Y, inp.Z Else Debug.Print strName, "Kein Eintrag!" End If strName = Dir Wend Set objRegExp = Nothing End Sub
[Diese Nachricht wurde von bst am 13. Sep. 2006 editiert.] [Diese Nachricht wurde von bst am 13. Sep. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |