Autor
|
Thema: Text Datei bearbeiten (1580 mal gelesen)
|
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 08. Nov. 2007 16:18 <-- editieren / zitieren --> Unities abgeben:
Guten Tag zusammen! Ich habe nun den Beitrag http://ww3.cad.de/foren/ubb/Forum226/HTML/000528.shtml und diesen http://ww3.cad.de/foren/ubb/Forum226/HTML/000808.shtml gelesen und versucht zu verstehen. Bahnhof. Mein Problem ist, dass ich diverse Suchbegriffe habe wie "Nodes", "Quad" usw und diese Zeilen löschen will. Oder noch besser: Alles was nach "Quad" ist gleich weglöschen. Die einzelnen Zeile filtern von 0 123.456 78.901 1 323.456 178.901 . . 38875 38.328 59.333 auf 123.456 78.901 323.456 178.901 . . 38.328 59.333 sollte ich eigentlich irgendwie hinkriegen - Denke ich! Leider habe ich in der Excel Hilfe auch nichts darüber gefunden, wie ich eine Zeile mit dem gefundenen Begriff weglösche. Irgendwelche Ideen / Ansätze? Vielen Dank schon mal! PS: Dateien mit bis zu 50'000 Zeilen sind sehr mühsam von Hand zu editieren! ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 08. Nov. 2007 16:27 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Zitat: Original erstellt von G. Dawg:
Die einzelnen Zeile filtern von 0 123.456 78.901 1 323.456 178.901 . . 38875 38.328 59.333auf 123.456 78.901 323.456 178.901 . . 38.328 59.333
Da brauchst du eigentlich nur das File umbenennen auf .sdf und dann mit Hilfe des Import-Assistenten von Excel öffnen; dann bekommst du diese 3 Werte in seperaten Spalten. Danach brauchst du nur noch die erste Spalte löschen... Zu deiner ersten Anfrage: das war mir auf die Schnelle zuviel Text - kannst du da nicht ein Beispiel bringen?
------------------ Grüsse Thomas Korrekturen zum Kochbuch AutoLISP Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 08. Nov. 2007 17:09 <-- editieren / zitieren --> Unities abgeben:
tunnelbauer, danke für die rasche Antwort. Doch genau mit dem Import-Dingsda habe ich es bisher gemacht. Doch es werden noch ganz, ganz viele Dateien auf mich zukommen! :-\ Nun wollte ich das Ganze automatisieren. Angehängt ist nun so eine Datei (output.txt) und wie sie aussehen sollte (real_output.txt). Ich brauche nur den ersten Abschnitt dieser Datei. Sprinch, bis zum Abschitt Quad. Dann muss ich nur den ersten Teil neu formatieren. Achja, die erste Zeile muss auch weg. Die Formatierung: Da sind immer 3 Zahlengruppen: # X Y Die # brauche ich auch nicht. Ich möchte schlussendlich nur die reinen XY Koordinaten in einer anderen Datei zurückspeichern. Also, alles bis zur zweiten Zahlengruppe löschen. Das Löschen bereitet mir Probleme. Ich konnte schon alle Punkte mit Kommas ersetzten ... da ich aber in der Schweiz zuhause bin, sind die Punkte die Dezimaltrennzeichen. Aber das ist so ein Thema für sich! Ich bin immernoch der Meinung, dass die in D alles falsch machen! ;D ------------------ [Diese Nachricht wurde von G. Dawg am 08. Nov. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 08. Nov. 2007 17:19 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Dein Quad kommt immer in der Datei vor und es ist immer alles zu löschen was darunter ist ? Versuche es halt mal als Basis mit dem Makro - Recorder. Erst mal in der ersten Spalte das Quad suchen, dann von da an bis Ende Tabelle alles selektieren und löschen, dann erste Spalte selektieren und löschen, zweite Spalte selektieren formatieren, dritte Spalte selektieren und formatieren. Dann solltest Du schon eine gute Basis haben um daraus ein allgemein gültiges Makro zu bauen. Axel Mal Quick and Dirty : Code: Sub Makro2() Columns("A:A").Select Selection.Find(What:="Quad", After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate Range(ActiveCell, Cells(65000, 25)).Select Selection.Delete Shift:=xlUp Columns("A:B").Select Selection.Delete Shift:=xlToLeft Rows("1:1").Select Selection.Delete Shift:=xlUp End Sub
[Diese Nachricht wurde von Axel.Strasser am 08. Nov. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 08. Nov. 2007 17:44 <-- editieren / zitieren --> Unities abgeben:
Hallo Axel! Unglaublich! Da hat sich was getan mit dem MacroRecorder seit Excel 97 (habe jetzt Excel 2007)! Das ist ja scho fast brauchbar! Jetzt nur noch mit den Makros von den anderen Beiträge mischen und fertig! Den MakroRecorder hätte ich nie im Leben versucht! Vielen Dank für den Tipp! Ich werde mich mit dem fertigen Makro melden, wenn es wirklich zu 100% funktioniert! Hoffentlich bis bald einmal! Gruss, Gilbert. ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 08. Nov. 2007 18:09 <-- editieren / zitieren --> Unities abgeben:
Mist... per Import, fügt Excel alles in Spalte A ein! Und jedesmal die Datei von "Hand" importieren macht auch kein Spass. Werde dem Excel-API schon noch auf die Schliche kommen. Note to myself: Sonst versuche ich es direkt mit der SWX-API, wenn es wirklich nicht anders geht. Da gibts schon das Gen3DCloud. Vielleich lässt sich dort was manupulieren?! ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tunnelbauer Ehrenmitglied V.I.P. h.c. Bauingenieur
Beiträge: 7085 Registriert: 13.01.2004 ich hab eh keine Probleme damit...
|
erstellt am: 08. Nov. 2007 18:21 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
|
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 08. Nov. 2007 21:30 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Das Einlesen kannst Du ja mal mit diesem Konstrukt versuchen: Code: ChDir "C:\Dokumente und Einstellungen\Axel\Desktop" Workbooks.OpenText Filename:= _ "C:\Dokumente und Einstellungen\Axel\Desktop\output.txt", Origin:=xlWindows, _ StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False, _ Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3 _ , 1), Array(4, 1)), TrailingMinusNumbers:=True
Axel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 08. Nov. 2007 21:31 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Da du erwähnst, dass du bis zu 50000 Zeilen bearbeiten musst und du nur die Bereinigte Datei brauchst, würde ich das komplett mittels Vba machen und nicht erst versuchen die Datei nach Excel zu importieren, irgendwann gehen dir die Zeilen aus Deine txt Datei zeilenweise einlesen, den String kürzen und neu raus schreiben, kann natürlich in Bezug der Auswahlmöglichkeit des Inputs/Outputs (Dialog) komfortabler gestaltet werden ,-) Code: Sub test() Dim fso ' FileSystemObject Dim textfile ' Dateiobjekt Dim test() As String 'Stringarray für die einzelnen Zeilen Dim outtext As String Dim i As Double ' Indexvariable [von Integer auf Double geändert ;) ] i = 0astring1 = "Nodes" estring2 = "Quad" Set fso = CreateObject("Scripting.FileSystemObject") 'Das FSO wird gesetzt Set textfile = fso.OpenTextFile("W:\input.txt", ForReading) 'Das Dateiobjekt wird auf die Datei gesetzt Open "W:\output.txt" For Output As #1 'Schleife bis EOF(End Of File) Do While textfile.AtEndOfStream <> True ReDim Preserve test(i) 'Dynamisches vergrössern des Arrays test(i) = textfile.ReadLine ' eine Zeile lesen If InStr(1, test(i), astring1) Then GoTo jump 'Wenn "Nodes" gefunden If InStr(1, test(i), estring2) Then GoTo jump1 'Wenn "Quad" gefunden outtext = Mid$(test(i), 16, 99)'einfaches trimmen Print #1, outtext i = i + 1 'Index erhöhen jump: Loop jump1: Close #1 'zu schreibende Datei wieder schliessen textfile.Close 'Datei wieder schließen End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 08. Nov. 2007 22:44 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
|
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 08. Nov. 2007 22:51 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
|
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 09. Nov. 2007 07:24 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Thomas Harmening:
Code:
Set textfile = fso.OpenTextFile("h:\tmp\input.txt", ForReading) 'Das Dateiobjekt wird auf die Datei gesetzt
Danke, Thomas Harmening! Das sieht schon mal vielversprechend aus. Jetzt aber: ich musste das Objekt "OpenTextFile" anders definieren:
Code:
Set textfile = fso.OpenTextFile("h:\tmp\input.txt", 1,0) 'Das Dateiobjekt wird auf die Datei gesetzt
[nochmals versuchen.... unnötige-lange-quitschende-musik-um-künstliche-nervende-spannung-zu-erzeugen] Aaaah!!! Jetzt aber!!!! Gleich nochmals mit einer anderen Datei... [jeopardy-countdown-musik und dazu kurz noch schnell eine Datei auf +270000 Zeilen (10MB) aufblasen] Thomas... es läuft nicht mal eine Sekunde und schon sind die 270000 Zeilen gefiltert!!!! Vielen, vielen, vielen Dank!!! Ich dachte nicht, dass das so schnell geht! Weder das verarbeiten, noch das erlangen eines funktionierenden Scrits!!! Unendlichen Dank, Thomas!!! ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 09. Nov. 2007 08:39 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Morgen auch, FWIW, ich hätte das so angefangen. CU, Bernd --
Code: Option ExplicitSub x() Dim intInpHandle As Integer ' Handle Eingabedatei Dim intOutHandle As Integer ' Handle Ausgabedatei Dim strOneLine As String ' Eine Zeile Dim intPos As Integer ' Position des 1. Leerzeichens in einer Zeile intInpHandle = FreeFile Open "e:\test\inp.txt" For Input As #intInpHandle intOutHandle = FreeFile Open "e:\test\out.txt" For Output As #intOutHandle Do While Not EOF(intInpHandle) Line Input #intInpHandle, strOneLine If InStr(1, strOneLine, "Nodes", vbTextCompare) < 1 Then If InStr(1, strOneLine, "Quad", vbTextCompare) > 0 Then Exit Do Else intPos = InStr(strOneLine, " ") If intPos > 0 Then strOneLine = Mid(strOneLine, intPos + 1) Print #intOutHandle, strOneLine End If End If Loop Close #intInpHandle Close #intOutHandle End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 09. Nov. 2007 08:48 <-- editieren / zitieren --> Unities abgeben:
bst, was ist da der Vorteil gegenüber dem Script von Thomas? Ich denke, dass da ein Vorteil ist, sonst hättest Du das nicht beigetragen. Ich werde es auf jeden Fall mal versuchen und auch einen Geschwindigkeitsvergleich machen. EDIT: Ok, sieht gut aus aber es filtert die erste Zahlengruppe nicht raus. ------------------
[Diese Nachricht wurde von G. Dawg am 09. Nov. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 09. Nov. 2007 10:58 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Hi, Zitat: aber es filtert die erste Zahlengruppe nicht raus.
Hmm, dann hatte ich wohl die Anfrage nicht richtig verstanden. Ich dachte Deine Eingabedaten hätten die Form: 0 123.456 78.901 1 323.456 178.901 . . 38875 38.328 59.333 und Du willst da die erste Zahl rauslöschen, also alles vom Zeilenanfang bis inklusive des ersten Leerzeichens. Zitat: bst, was ist da der Vorteil gegenüber dem Script von Thomas?
IMHO sollte es: a) noch schneller sein, da es auf den hier unnötigen "Redim Preserve" verzichtet und b) auch mit (fast) beliebig grossen Dateien funktionieren und nicht bei 32.767 Zeilen ohne "Nodes" und "Quad" schlapp machen. (Dim i as integer) CU, Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 09. Nov. 2007 11:21 <-- editieren / zitieren --> Unities abgeben:
bst, der genau Inhalt ist in den Daten die ich hochgeladen habe: Code: Nodes 0 33.36039 10.46330 1 33.36039 10.93934 3 33.36039 10.73939 3 33.36039 10.93991 4 33.36039 11.99993 9 33.36039 11.33999 6 33.36039 11.93997 7 33.36039 11.73993 3 33.36039 11.93999 139 33.36039 99.19000 33410 33.36039 99.39790
Leider beginnt (fast) jede Zeile mit mehr als einem Leerzeichen und da steht es bei mir an! :(
Code: outtext = Mid$(test(i), 16, 99)'einfaches trimmen
Filtert zwar ab Zeichen 16 (welchen ich auch 12 geändert habe, weil vielleicht mal ein grösseres Teil kommt, welches auch mal über 100mm lang ist) bis 99. Ich wollte dann mit der Anweisung "count" bis zur zweiten Zahlengruppe zählen und den Wert auf die Mid$ Funktion übertragen. Leider bin ich zu doof, die Count-Funktion zu nutzen. Unser VB-Spezi ist gerade eben 3 Wochen im grünen Urlaub (Militärdienst). Ich habe es nicht zustande gebracht, die Lücken auf der n Zeile zu zählen, dann wieder zählen bis wieder eine Lcke kommt und dann Mid$ anzuwenden. Doch jetzt funktioniert es mit "Mid$(test(i), 12,99" sehr gut! Vielleicht kann ich den Teil in Dein Script einfügen, bst. Ich werde mich melden.... schon mal ein grosses DANKE an Alle!!! ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 09. Nov. 2007 11:37 <-- editieren / zitieren --> Unities abgeben:
Ich habe es so versucht Code: strOneLine = " 6 33.36039 11.93997 " strOneLine = Mid$(strOneLine, 12, 99) 'einfaches trimmen debug.print strOneLine ' " 33.36039 11.93997 " Do Dim vDummy vDummy = InStr(strOneLine, " ") strOneLine = Right(strOneLine, Len(strOneLine) - vDummy) debug.print strOneLine ' *** Loop While vDummy <> 0
meine Zeile von den übrig bleibenden vorab-Leerzeichen zu befreien. Es löschte mir die ganze Zeile! *** debug.print ( "_" als Leerzeichen für die Formatierung): ____33.36039 11.93997 ___33.36039 11.93997 __33.36039 11.93997 _33.36039 11.93997 33.36039 11.93997 ___11.93997 __11.93997 _11.93997 11.93997
------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 09. Nov. 2007 11:53 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Hi, ist Dir das Ausgabeformat egal, d.h. kann es auch: 33.36039X11.93997 sein wobei X exakt ein Leerzeichen ist? Oder müssen da exakt 4 Leerzeichen sein, oder exakt so viele wie eingelesen wurden, oder ?? CU, Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 09. Nov. 2007 11:57 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Gilbert, ich würde Excel die Arbeit machen lassen und die Datei ins Excel nehmen, dann hast Du das ganze Problem mit den Blanks nicht. Sonst musst Du Dich noch mit Trim und Such Funktion umeinanderschlagen Axel [Diese Nachricht wurde von Axel.Strasser am 09. Nov. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 09. Nov. 2007 12:00 <-- editieren / zitieren --> Unities abgeben:
Leider weiss ich nie genau, wieviele Leerzeichen es wirklich sind. Das kommt ganz auf die Geometrie des Teiles an.... leider!!! Was ich weiss: [xLeerzeichen] [Zahlen die ich nicht brauche] [xLeerzeichen] [Zahlen die ich brauche] [xLeerzeichen] [Zahlen die ich brauche] und später einmal, kommt noch eine dritte (bzw. vierte) Spalte mit Zahlen, die ich brauche .... btw: es schneit!!!! ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 09. Nov. 2007 12:11 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Hi, hmm, jetzt habe auch ich (endlich) die angehängten Dateien gefunden ... Ist Dir mit sowas gedient? Ersetzt an jedem Zeilenanfang Leerzeichen + Ziffern + Leerzeichen durch nichts, via: re.Pattern = "^\s+\d+\s+" ^ Anfang der Zeile \s+ beliebig viele Leerzeichen \d+ beliebig viele Ziffern \s+ beliebig viele Leerzeichen CU, Bernd --
Code:
Option ExplicitSub x() Dim intInpHandle As Integer ' Handle Eingabedatei Dim intOutHandle As Integer ' Handle Ausgabedatei Dim strOneLine As String ' Eine eingelesene Zeile Dim intPos As Integer ' Position des 1. Leerzeichens in einer Zeile Dim re As Object ' Eingabezeile getrennt nach Leerzeichen Set re = CreateObject("vbscript.regexp") re.Pattern = "^\s+\d+\s+" intInpHandle = FreeFile Open "e:\test\inp.txt" For Input As #intInpHandle intOutHandle = FreeFile Open "e:\test\out.txt" For Output As #intOutHandle Do While Not EOF(intInpHandle) Line Input #intInpHandle, strOneLine If InStr(1, strOneLine, "Nodes", vbTextCompare) < 1 Then If InStr(1, strOneLine, "Quad", vbTextCompare) > 0 Then Exit Do Else Print #intOutHandle, re.Replace(strOneLine, "") End If End If Loop Close #intInpHandle Close #intOutHandle End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 09. Nov. 2007 12:35 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von bst: Ist Dir mit sowas gedient?Ersetzt an jedem Zeilenanfang Leerzeichen + Ziffern + Leerzeichen durch nichts, via: re.Pattern = "^\s+\d+\s+" ^ Anfang der Zeile \s+ beliebig viele Leerzeichen \d+ beliebig viele Ziffern \s+ beliebig viele Leerzeichen
Das glaub' ich ja nicht! Ich hatte keine Ahnung das VB auch RegEx kann (ich kenn das nur von PHP)!!! Ist ja geil!! *gutesbierzuschiebundaufswochenendetrinken* Ich werde das nach dem Mittagessen gleich ausprobieren!!! Kann es kaum erwarten.... @Axel: nun muss ich das nicht mehr tun! RegEx hat die Funktionen schon eingebaut! Das ist wie Weihnachten und Geburtstag und Ostern und St.Patrick's Day zusammen!
------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 09. Nov. 2007 13:35 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von bst:
Code:
Print #intOutHandle, re.Replace(strOneLine, "")
Hat bei mir nicht funktioniert. EDIT: So gehts:
Code: strOneLine = re.Replace(strOneLine, "") Print #intOutHandle, strOneLine
------------------ [Diese Nachricht wurde von G. Dawg am 09. Nov. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 09. Nov. 2007 13:58 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
|
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 09. Nov. 2007 14:04 <-- editieren / zitieren --> Unities abgeben:
Er hat einfach nichts in die Datei geschrieben?!? Keine Ahnung! Hier ist, was ich bis jetzt habe! Es gibt noch ein paar kleine Anpassungen ist aber soweit sehr viel besser, als das was ich heute Morgen hatte! Code: Option Explicit ' declarations, used windows API calls and constants ' Deklarationen, benötigte Windows API-Calls und KonstantenPublic Enum swLengthUnit_e swMM = 0 swCM = 1 swMETER = 2 swINCHES = 3 swFEET = 4 swFEETINCHES = 5 swANGSTROM = 6 swNANOMETER = 7 swMICRON = 8 swMIL = 9 swUIN = 10 End Enum ' Windows API to get the free discspace Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" ( _ ByVal lpRootPathName As String, _ lpFreeBytesAvailableToCaller As Currency, _ lpTotalNumberOfBytes As Currency, _ lpTotalNumberOfFreeBytes As Currency) As Long ' Windows API for the SaveAs Filebox Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _ (pOpenfilename As OPENFILENAME) As Long ' structure needed by Windows API Private Type OPENFILENAME lStructSize As Long hwndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As String End Type Private Sub cmdDesiredFileName_Click() ' common dialog for browse for desired filename Dim OFName As OPENFILENAME Dim tmp As String 'Set the structure size OFName.lStructSize = Len(OFName) 'Set the filet OFName.lpstrFilter = "IVP Result File (*.res)" + Chr$(0) + "*.res" + Chr$(0) + "All Files (*.*)" + Chr$(0) + "*.*" + Chr$(0) 'Create a buffer OFName.lpstrFile = Space$(254) 'Set the maximum number of chars OFName.nMaxFile = 255 'Create a buffer OFName.lpstrFileTitle = Space$(254) 'Set the maximum number of chars OFName.nMaxFileTitle = 255 'Set the initial directory OFName.lpstrInitialDir = "c:\temp\fürer\" 'Set the dialog title OFName.lpstrTitle = Datei_Eingabe.Caption 'no extra flags OFName.flags = 0 'default extension OFName.lpstrDefExt = "res" + Chr$(0)
'Show the Dialog box If GetSaveFileName(OFName) Then txtDesiredFileName.Text = Trim$(OFName.lpstrFile) Else txtDesiredFileName.Text = "" End If End Sub Private Sub CancelButton_Click()
Unload Datei_Eingabe End Sub Sub OK_Button_Click() Dim intInpHandle As Integer ' Handle Eingabedatei Dim intOutHandle As Integer ' Handle Ausgabedatei Dim strOneLine As String ' Eine eingelesene Zeile Dim intPos As Integer ' Position des 1. Leerzeichens in einer Zeile Dim re As Object ' Eingabezeile getrennt nach Leerzeichen Set re = CreateObject("vbscript.regexp") re.Pattern = "^\s+\d+\s+" ' RegEx: [leer][zahl][leer] intInpHandle = FreeFile Open txtDesiredFileName.Text For Input As #intInpHandle 'call OpenFile Dialog box intOutHandle = FreeFile Open "c:\tmp\output.txt" For Output As #intOutHandle ' TODO: SaveAs...?!? öhm? Do While Not EOF(intInpHandle) Line Input #intInpHandle, strOneLine If InStr(1, strOneLine, "Nodes", vbTextCompare) < 1 Then If InStr(1, strOneLine, "Quad", vbTextCompare) > 0 Then Exit Do Else 'Debug.Print "1: "; strOneLine strOneLine = re.Replace(strOneLine, "") Print #intOutHandle, strOneLine 'Debug.Print "2: "; strOneLine End If End If Loop Close #intInpHandle Close #intOutHandle Set re = Nothing Unload Datei_Eingabe End Sub
------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 09. Nov. 2007 14:42 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
Hmm, kein Plan. Da re.Replace einen String zurückliefert sollte das eigentlich immer gehen. Übrigens, Was willst Du denn mit "Private Declare Function GetSaveFileName" ? In Excel gibt es "Application.GetOpenFilename" sowie "Application.GetSaveAsFilename", siehe VBA-Hilfe dazu. CU, Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 09. Nov. 2007 14:46 <-- editieren / zitieren --> Unities abgeben:
|
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 09. Nov. 2007 15:10 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
hmm, ja, mein Code ist irgendwie chaotisch, Bernds Vorschlag ist da wohl durch strukturiert - ein Glück, das ich mit dem Programmieren kein Geld verdienen muss^^ deinen Dialog könntest du so abändern
Code: intInpHandle = FreeFile ChDrive "c:\temp\fürer\" IVPResultFile = Application.GetOpenFilename("IVP Result File (*.res),*.res") 'call OpenFile Dialog box If IVPResultFile = False Then Exit Sub Open IVPResultFile For Input As #intInpHandle intOutHandle = FreeFile IVPoutput = Left(IVPResultFile, Len(IVPResultFile) - 4) + ".txt" Open IVPoutput For Output As #intOutHandle ' TODO: SaveAs...?!? öhm?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 09. Nov. 2007 15:36 <-- editieren / zitieren --> Unities abgeben:
Das ist aber auch ganz schön, Thomas! Da wird doch glatt eine neue .txt (mit dem richtigen Namen! ) in das gleiche Verzeichnis gespeichert! Plus, ich habe einen Schritt gespart! Datei auswählen, Start drücken. Nun startet er direkt nach dem Auswählen! ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 09. Nov. 2007 15:55 <-- editieren / zitieren --> Unities abgeben: Nur für G. Dawg
ich vergass noch, dass man das Verzeichnis vordefinieren kann ChDrive "c:\temp\fürer\" ist im obigen Code nachgezogen worden. ;-) Makrotechnisch lässt sich das auch realisieren, dass immer auf das aktuellste *.res im Verzeichnis xy zugegriffen wird, dann müsstest du nur die xl-mappe aufrufen ;-) oder halt gleich den Code als Windows Scripting Host (WSH) -dann braucht man Excel nicht ;-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004
|
erstellt am: 09. Nov. 2007 16:03 <-- editieren / zitieren --> Unities abgeben:
Gute Idee, brauch ich aber nicht Da die Daten nur zum ausprobieren in meinem temp sind. Bin noch an der Fehlerabfrage und dann werde ich das Script nochmals hier hinstellen - Für die, die es interessiert. Wünsche allen ein schönes Wochende! ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
G. Dawg Ehrenmitglied V.I.P. h.c. FEM Simulant / Konstrukteur / SolidWorks
Beiträge: 2622 Registriert: 12.07.2004 SolidWorks_2o2o SP3.o Win10_x64, Quadro_P2ooo. VisualStudio_2o19_Pro. FEM: Forge_NxT_HPC, ANSYS_WB. 3D-Printer: Ultimaker_2, Tinker_Gnome.
|
erstellt am: 09. Jan. 2008 13:29 <-- editieren / zitieren --> Unities abgeben:
So! Endlich habe ich eine einigermassen funktionstüchtige Version meines Makros! --> Siehe Anhang, Makro mit Beispieldateien. Einziges Problem ist noch, wenn die erste Reihe in X Achse eine negative Zahle ist (z.b. -0.01) und die nächste Zahl positiv ist (0.01) bricht das Programm ab! Ich weiss woran es liegt, aber ich weiss nicht wie ich es beheben kann! Ich habe einen Bias von 1mm der mir sicherstellt, dass wirklich nur die Kontur übernommen wird... Eigentlich sollte es nie einen negativen Wert für die X Achse geben (in der ersten Zeile!)! ------------------ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |