| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | |  | PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Vergleich von zwei sequentiellen Dateien (1297 mal gelesen)
|
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 01. Dez. 2004 09:47 <-- editieren / zitieren --> Unities abgeben:         
Hallo alle miteinander, auch wenn heute noch nicht Donnerstag ist, will ich doch schon eine neue Frage stellen. ;-) Folgendes: ich habe zwei sequentielle Dateien anlegen lassen: "Blockauslesung" und "AP-Koordinaten". Nun will ich den Inhalt dieser beiden Dateien miteinander vergleichen. Treten Übereinstimmungen auf, dann sollen die in einer neuen sequentiellen Datei abgelegt werden. Folgenden Code habe ich mir ausgedacht: Code:
Sub Vergleich() Dim Text1, Text2, Text3 Open "Blockauslesung" For Input As #1 Open "AP-Koordinaten" For Input As #2 Open "Vergleich" For Output As #3 Do While Not EOF(1) 'Schleife bis Dateiende "Blockauslesung" Input #1, Text1 'Daten der Datei "Blockauslesung" in Variable Text1 einlesen Do While Not EOF(2) Input #2, Text2 'Daten der Datei "AP-Koordinaten" in Variable Text2 einlesen If Text1 = Text2 Then Text3 = Text1 Write #3, Text3 Write #3, End If Loop Loop Close #1 Close #2 Close #3 End Sub
Nun habe ich das mal getestet. Ich will, dass die ERSTE Zeile der ersten Datei mit allen Zeilen der zweiten Datei verglichen wird. Dann soll die ZWEITE Zeile der ersten Datei wieder mit allen Zeilen der zweiten Datei verglichen, dann die DRITTE mit allen usw. usw.... Das riecht ja verdammt nach Schleifen... :-) Also habe ich die ineinander verschachtelten Do-Loop-Schleifen gebaut. Aber wenn ich nun die Prozedur mal im Einzelschrittverfahren durchlaufen lasse, passiert folgendes: er nimmt sich die erste Zeile der ersten Datei (Blockauslesung) vor und überprüft diese mit allen Zeilen der zweiten Datei. Wenn er die innere Schleife durchlaufen hat, holt er sich die zweite Zeile der ersten Datei, geht aber nicht mehr in die innere Schleife rein. Ich denke mal, weil da steht "Do While Not EOF(2)"? Denn das Ende der zweiten Datei hatte ich ja vorher bereits erreicht? Wie könnte ich es hinbekommen, dass er wieder die innere Schleife durchläuft? ------ ...oder muß ich die Anweisung geben, die Datei wieder von vorn zu durchsuchen? Also den Cursor in die erste Zeile zurücksetzen? Wenn ja, welche Syntax gibt es dafür? Könnte es was bringen, anstatt einer kopfgesteuerten Schleife, eine fußgesteuerte Schleife zu nutzen? Dann würde er ja immerhin erstmal in die Schleife gehen? ----- ....das habe ich jetzt ebenfalls getestet, aber so richtig funktionieren tut das auch nicht Vielleicht kann mir jemand einen Tipp geben. Ich hoffe, ich konnte das Problem und was ich will einigermaßen verständlich machen.
Habe auch gerade noch etwas von der "Loc"-Funktion und "Seek"-Funktion gelesen und die mal getestet. Kam da abr nicht so richtig weiter - könnten die mir bei meinem Problem helfen? Tobias [Diese Nachricht wurde von kiltswitch am 01. Dez. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator

 Beiträge: 2494 Registriert: 02.11.2001
|
erstellt am: 01. Dez. 2004 12:48 <-- editieren / zitieren --> Unities abgeben:          Nur für kiltswitch
Hi, also in LISP würde ich beide Files erstmal komplett jeweils in eine Liste auslesen und dann die Vergleichsgeschichten durchführen. Ob sich das in VBA jedoch so übertragen läßt, weiß ich nicht. Aber wäre ein Ansatz. Könntest Du eventuell Arrays verwenden? ------------------ Ciao, Marc Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 01. Dez. 2004 12:59 <-- editieren / zitieren --> Unities abgeben:         
Mmh, so bin ich an die Sache noch gar nicht rangegangen. Ob das eine mögliche Variante ist, weiß ich noch nicht, ich muß mir dazu zunächst Gedanken machen. Wenn ich dann alle Daten in einer Datei hätte - wie finde ich denn dann die Übereinstimmungen heraus? Also wie kann ich in der Datei Vergleiche durchführen? Ich müßte ja einen Code schreiben, mit dem ich Zeilen in der Datei ansprechen kann, oder? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 01. Dez. 2004 13:11 <-- editieren / zitieren --> Unities abgeben:         
Ich habe es noch nicht rausgefunden, aber kann man einer sequentiellen Datei zuweisen, dass diese wieder von Beginn an durchlaufen wird? D.h., nachdem EOF (End of File) erreicht wurde, soll es wieder von Beginn losgehen. Gibt es einen entsprechenden Befehl oder eine Funktion dafür? Tobias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
marc.scherer Ehrenmitglied V.I.P. h.c. CAD-Administrator

 Beiträge: 2494 Registriert: 02.11.2001
|
erstellt am: 01. Dez. 2004 15:23 <-- editieren / zitieren --> Unities abgeben:          Nur für kiltswitch
Hi, wer zum Teufel spricht von 'ner neuen Datei??? LIEST Du mal bitte!!! Ich würde in Lisp zwei Listen erstellen, denen Variablen zuweisen: Var1 = '(1 2 3 4 5 6) Var2 = '(2 5 7 9 10) Und dann deren Werte miteinander vergleichen. Nix neue Datei, Variablen im Speicher! ------------------ Ciao, Marc [Diese Nachricht wurde von marc.scherer am 01. Dez. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 01. Dez. 2004 16:59 <-- editieren / zitieren --> Unities abgeben:         
Mit LISP kenne ich mich noch nicht so aus, deshalb wäre es mir lieber, wenn das in VBA realisiert werden kann. Bloß wie gesagt, ich weiß leider nicht, wie ich dann in einer kompletten Liste die Daten vergleichen kann...? :-( Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH

 Beiträge: 4191 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 01. Dez. 2004 17:18 <-- editieren / zitieren --> Unities abgeben:          Nur für kiltswitch
Hallo Kiltswitch, Grundlagen! Mehr sage ich dazu nicht. In Anlehnung an Marc, denn was Marc dir schreibt, das sind Prinzipien, unabhängig davon mit welcher Programmiersprache du hantierst.
Code:
for each ItemVar1 in var1 for each ItemVar2 in var2 Vergleichen, oder was auch immer next next
Holger ------------------ Holger Brischke (defun - Lisp over night! Autodesk User Group Central Europe AutoLISP-Programmierung für AutoCAD AUGCE Manager Deutschland Da weiß man, wann man's hat! [Diese Nachricht wurde von Brischke am 01. Dez. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 02. Dez. 2004 08:44 <-- editieren / zitieren --> Unities abgeben:          Nur für kiltswitch
ohne jetzt auf die variante einzugehen, die dateien zuerst einzulesen und dann erst zu vergleichen. du macht folgenden fehler: die innere schleife läuft bis eof(2). der dateizeiger steht dann natürlich am dateiende und rutscht nicht mehr bach vorne. du müsstest das folgendermassen umbauen: open ...... for input as #2 Do While Not EOF(2) .... Loop close #2 d.h immer erst vor dem inneren schleifendurchgang die datei öfnnen, und dann sofort wieder schlissen. damit steht der dateizeiger immer am schleifenanfang am dateianfang.
natürlich wäre die marc und holger angesprochenen version, die datei vorher einzulesen die elegantere, und höchstwarscheinlich auch die schnellere version
------------------ WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 02. Dez. 2004 09:03 <-- editieren / zitieren --> Unities abgeben:         
@fuchsi: Ja, diese Lösung habe ich inzwischen rausbekommen, war aber noch nicht dazu gekommen, dass hier zu erwähnen. Bin heute früh nochmal logisch an die Sache rangegangen und da hat es dann geklappt. Nur das optische Resultat in der neuen Datei gefällt mir noch nicht, aber das ist ja noch optimierbar - die Programmierung stimmt jedenfalls jetzt. Trotzdem Danke für Deine Hilfe. Aber vielleicht kannst Du mir sagen, wie das mit dem Ansatz von Marc und Holger funktionieren würde, also wie der Code wäre? ------------------ Gruß Tobias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 02. Dez. 2004 13:52 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich habe noch ein Problem beim Vergleich meiner zwei sequentiellen Dateien. Es gibt die übereinstimmenden Daten nicht 100% so aus, wie ich das will. Am besten wäre es, wenn man DATENTRIPEL aus Datei1 und Datei2 vergleichen kann. In Datei1 werden alle Blockreferenzen der Zeichnung mit den X,Y,Z-Koordinaten ihrer InsertionPoints abgelegt. In der Datei2 stehen von mir berechnete X,Y,Z-Koordinaten von bestimmten Anschlußpunkten von Anbauteilen an einem Hauptbauteil. Da diese Anbauteile auch als Blockreferenz in Datei1 vorkommen, liegen in beiden Dateien übereinstimmende X,Y,Z-Koordinaten vor. Nun will ich diese Übereinstimmung herausbekommen und in der Datei3 ablegen. Kann man in einer sequentiellen Datei mehrere Daten gleichzeitig ansprechen? Und wenn ja, wie? Also in etwa so: wenn Datentripel X,Y,Z (Koordinatentripel) in Datei1 gleich dem in Datei2 ist, dann schreibe diese in die neue Datei... Wäre für jeden Tipp dankbar... ------------------ Gruß Tobias
[Diese Nachricht wurde von kiltswitch am 02. Dez. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 02. Dez. 2004 14:24 <-- editieren / zitieren --> Unities abgeben:          Nur für kiltswitch
hier nur als kleiner anhalt Dim p(0 To 2) As Double Dim punkte1 As New Collection ' statt dieser for schleife liest du die erste datei ein und speicherst die x y z werte ind die kollection p(0),p(1),p(2) ich habe es testweise halt mit 0,0,0 1,1,1 2,2,2 usw. gefüllt For i = 0 To 15 p(0) = i p(1) = i p(2) = i punkte1.Add p Next ' jetzt machst du eine schleife, wo du datei 2 zeile füe zeile einliest, und testest mit folgendem code ob die x y z werte in der collection sind ich habs hier jetzt nur mit 4,4,4 gemacht. p(0) = 4 p(1) = 4 p(2) = 4 Dim p2(0 To 2) As Double For i = 1 To punkte1.Count If punkte1(i)(0) = p(0) And _ punkte1(i)(1) = p(1) And _ punkte1(i)(2) = p(2) Then MsgBox "gefunden" Exit For End If Next ist jetzt nur ein wild zusammengewürfelt, aber so in etwa könnte es ablaufen ------------------ WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 02. Dez. 2004 16:50 <-- editieren / zitieren --> Unities abgeben:         
Hallo Fuchsi, danke für den Code. Den werde ich mir mal genauer betrachten und testen. Eine Frage habe ich dazu: Findet der die Koordinatenpaare auch, obwohl in den beiden Dateien auch noch andere Dinge stehen? Also z.B. Blockname, Block-ID, allgemeiner Text. Müßte ja eigentlich trotzdem gehen, oder? Ich habe das Ganze mal mit Excel getestet und gerade eben auch hinbekommen. Excel wäre aber nur eine "Notlösung", denn ich will das schon gern mit den sequentiellen Dateien schaffen.
------------------ Gruß Tobias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 03. Dez. 2004 09:39 <-- editieren / zitieren --> Unities abgeben:         
@fuchsi: Hallo, also ich habe Deinen Code jetzt gerade mal getestet, aber leider kriege ich das nicht hin und verstehe das einfach nicht so richtig. Ich habe immer noch ein Problem - vielleicht auch ein Denkproblem, mit meinen sequentiellen Dateien. Sie werden ja der Reihe nach eingelesen. Geht es denn überhaupt, in so einer Datei (kann z.B. eine Textdatei sein) MEHRERE Werte gleichzeitig zum Vergleich zu nutzen? Ich müßte die X-Y-Z-Koordinaten (das sind ja DREI Werte !) der einen Datei mit der anderen Datei vergleichen.
------------------ Gruß Tobias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 03. Dez. 2004 10:46 <-- editieren / zitieren --> Unities abgeben:         
Ich hab mir auch mal noch Gedanken zu Binärdateien gemacht und meinen Code ein bißchen umgeschrieben. Leider bringt er mir beim Ausführen eine Fehlermeldung: "Laufzeitfehler 458: Variable verwendet einen in Visual Basic nicht unterstützten Typ der Automatisierung" Ich habe mal meinen Code hierher gesetzt (die Stelle, wo der Fehler kommt, ist markiert). Kann mir jemand sagen, was falsch ist? Könnte evtl. mit der Variablendeklaration von Txt1, Text2, Text3 zusammenhängen. Wenn ich Double als Datentyp nehme, kommt es zu einem Überlauf, nehme ich Variant kommt die o.g. Fehlermeldung. Wenn ich einfach "Dim Text1" schreibe, kommt auch die Fehlermeldung. ------ NACHTRAG: Beim Einzelschrittablauf des Programm habe ich festgestellt, dass die innere Schleife beim ERSTEN MAL durchlaufen (und die angesprochene Codezeile akzeptiert) wird. Der Fehler tritt erst beim ZWEITEN Durchlauf auf... Vielleicht ist diese Info von Wichtigkeit.
Code:
Sub Vergleich() Dim Text1 Dim Text2 Dim Text3 Open "Blockauslesung2.bin" For Binary As #1
Open "Vergleich2.bin" For Binary As #3 Do While Not EOF(1) 'Schleife bis Dateiende "Blockauslesung" Get #1, , Text1 'Daten der Datei "Blockauslesung" in Variable Text1 einlesen Open "AP-Koordinaten2.bin" For Binary As #2 Do While Not EOF(2) 'Schleife bis Dateiende "AP-Koordinaten" Get #2, , Text2 'Daten der Datei "AP-Koordinaten" in Variable Text2 einlesen --- HIER TRITT DER FEHLER AUF If Text1 = Text2 Then Text3 = Text1 Put #3, , Text3 Debug.Print Text3 End If Loop Close #2 Loop Close #1 Close #3 End Sub
[Diese Nachricht wurde von kiltswitch am 03. Dez. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 03. Dez. 2004 11:34 <-- editieren / zitieren --> Unities abgeben:          Nur für kiltswitch
also wie deine daten in deinen dateien gespeichert sind, kann ich natürlich nicth erahnen. das könnte in einer textdatei z.B.: so aussehen Block1 1523 1589 0 Block2 4569 21112 0 Block3 4545 1212 0 also blockname x y und z wert einfach mit blank getrennt oder vielleicht so "Block1","1523","1589","0" "Block2","4569","21112","0" "Block3","4545","1212","0" solange du uns da keine angaben machst , wie deine Dateien aufgebaut sind , können wir dir nicht weiterhelfen. lade vielleicht mal die 2 dateien hoch ------------------ WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 03. Dez. 2004 11:49 <-- editieren / zitieren --> Unities abgeben:         
Ja ok, das stimmt natürlich, dass man sich das nicht selber denken kann, wenn man die Textdateien nicht hat. Ich habe sie mal hier hochgeladen (die beiden Ausgangsdateien und die Datei, wie es bei mir z.Zt. im Vergleich ausgegeben wird). Das mit blank wußte ich noch gar nicht. Er erkennt dann aber in der Zeile trotzdem noch die einzelnen Werte, oder faßt er das als einen String auf? ------------------ Gruß Tobias [Diese Nachricht wurde von kiltswitch am 03. Dez. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
   
 Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 03. Dez. 2004 13:17 <-- editieren / zitieren --> Unities abgeben:          Nur für kiltswitch
probiers mal mit diesem code hier habe ich 6 übereinstimmende Punkte gefunden (allerdings hat die adtei AP-Koordinaten keinen Z-wert) Sub test() Dim punkte1 As New Collection Dim p(0 To 2) As String Open "d:\test\Blockauslesung2.txt" For Input As #1 While Not EOF(1) ' jeder Datensatz besteht anscheinen aus 7 Zeilen in der Datei Line Input #1, dat ' nicht interresant Blockname ? Line Input #1, dat ' nicht interresant referenznummer ? Line Input #1, p(0) ' x-wert Line Input #1, p(1) ' y-wert Line Input #1, dat ' nicht interresant ??? Line Input #1, dat ' nicht interresant ??? Line Input #1, dat ' nicht interresant ??? p(2) = "0" punkte1.Add p Wend Close #1 Open "d:\test\AP-Koordinaten2.txt" For Input As #1 Line Input #1, dat ' nicht interresant erste Überschrift While Not EOF(1) Line Input #1, dat ' nicht interresant Text Anschlusspunkt Line Input #1, p(0) ' x-wert Line Input #1, p(1) ' y-wert For i = 1 To punkte1.Count If punkte1(i)(0) = p(0) And _ punkte1(i)(1) = p(1) And _ punkte1(i)(2) = p(2) Then MsgBox "gefunden X:" & p(0) & " Y:" & p(1) & " Z:" & p(2) Exit For End If Next Wend Close #1
End Sub ------------------ WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
kiltswitch Mitglied
 
 Beiträge: 189 Registriert: 27.10.2004 Windows 98 (Version 4.10.1998) AutoCAD 2000i
|
erstellt am: 03. Dez. 2004 14:42 <-- editieren / zitieren --> Unities abgeben:         
Hallo fuchsi, danke für den Code. Es klappt jetzt alles! 10 Unities habe ich Dir ja schon gegeben. :-) Und ich kann nur bestätigen, dass diese Lösung viel besser als die mit Excel ist - die Prozedur wird wesentlich schneller abgearbeitet! ------------------ Gruß Tobias [Diese Nachricht wurde von kiltswitch am 03. Dez. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |