Autor Beitrag
alexpj
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 26.01.21 19:39 
Hallo liebe Experten,

ich arbeite immer noch an einer Schnittstelle Aufmaßprogramm (DigiPlan) -> Firebird Datenbank einer Branchensoftware (Waricum)
Das ist alles fertig bis auf ein Problem.

Das Datenbankfeld gestattet max 80 Zeichen und ist fest vorgegeben.
Die Zahlenketten sind aber deutlich länger und müssen vor dem Import mathematisch korrekt gesplittet werden.
Beispiel 1:
ausblenden Quelltext
1:
1* [(0+4,9)*(0+0) + (4,9+4,916)*(-5,815+0) + (4,916+0,014)*(-5,815+-5,815) + (0,014+0)*(0+-5,815)] * 0.5					

Beispiel 2:
ausblenden Quelltext
1:
1* [(0+4,985)*(0+0) + (4,985+4,993)*(-5,814+0) + (4,993+0,005)*(-5,817+-5,814) + (0,005+0)*(0+-5,817)] * 0.5					


So würde ich mir das Ergebnis für Beispiel eins vorstellen:
ausblenden Quelltext
1:
2:
3:
1* [(0+4,9)*(0+0) + (4,9+4,916)*(-5,815+0) + (4,916+0,014)*(-5,815+-5,815) ] *0,5

1* [(0,014+0)*(0+-5,815)] * 0.5


some facts: alle Zeilen beginnen stets mit 'x* (' oder 'x* [('
und enden mit ')' oder ')]' oder '] *x'

ich habe leide keine Idee, wie das zu lösen wäre, zumal meine Kenntnisse im Bereich regex bei weitem nicht ausreichen.

vielleicht bekomme ich hier etwas Starthilfe?

crosspost hier: c# -> how to split mathematical chain of numbers in brackets?

Edit:Ticks entfernt

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.


Zuletzt bearbeitet von alexpj am Di 26.01.21 22:15, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18978
Erhaltene Danke: 1679

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 26.01.21 19:55 
So richtig verstehe ich noch nicht was du da machen möchtest (warum sind da Zahlenwerte drin, werden aber nicht ausgerechnet? oder meinst du eigentlich Variablen mit diesen Werten?), aber das Sinnvollste dürfte ein Parser sein, der das ganze in einen Baum packt. Dann kannst du daran dann unabhängig von der Textrepräsentation mathematisch arbeiten und am Ende wieder einen String daraus machen.

Mit einer Regular Expression ginge es nur, wenn die Struktur immer ähnlich wäre und immer genau gleich behandelt werden soll. Ich habe aber noch nicht verstanden wie du auf das Ergebnis kommst bzw. wie das gemeint ist. Die innere Addition könnte man nach außen ziehen, aber da komme ich nicht auf das Ergebnis.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4507
Erhaltene Danke: 929


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 26.01.21 21:15 
Die Ticks im zweiten Beispiel gehören die dazu?


Manchmal hilft es Probleme woanders anzugreifen. Also
* Wie ist der string entstanden? Kann man früher ansetzen, dort wo er zusammengebaut wird, so das er erst gar nicht zu lang wird?
* Kann man nicht einfach direkt immer mit den Einzelteilen arbeiten ohne so einen string zusammenzusetzen um ihn dann wieder kürzen zu müssen? Vermutlich kann das so ja im Moment beliebig lang sein und muss im Zweifel auch in mehrere Einzelteile zerlegt werden.
alexpj Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 26.01.21 22:13 
Die Masketten stammen aus einem grafischen Aufmass und bilden als viele Teilflächen eine aufzumessene Gesamtfläche ab.

Die stammen aus einer kommerziellen Software. Allerdings erscheinen mir die Zahlenreihen nun bei näherer betrachtung sehr suspekt. Ich habe mal versucht. einzelne Zahlengruppen in der originalsoftware nachvollziehbar zu finden. keine Ahnung, was die da mir einem Raum, der sich in 2 Dreiecke zerteilen ließ anstellen. Da passt irgendwie nichts zu den ausgegebenen Zahlen.

Das Ergebniss, was auch mitgeliefert wird stimmt allerdings in Bezug auf die dazugehörige Fläche.


Der Plan war, die Ketten so zu zerteilen, das sie sich in eine andere kommerzielle Software importieren lassen. Für ein Aufmaß wird immer der Weg und das Ergebnis benötigt.
alexpj Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Di 26.01.21 22:14 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Die Ticks im zweiten Beispiel gehören die dazu?


nein, die sind da irgendwie reingeraten
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1217
Erhaltene Danke: 160

Windows 10 x64 Home Premium
C# (Visual Studio Preview)
BeitragVerfasst: Mi 27.01.21 00:33 
Wenn die Struktur tatsächlich immer so ist, finge es doch mit Regex.

Die eckigen Klammern machen einen Teil der Arbeit, das holt dir den Inhalt aus den eckigen Klammern:
Zitat:
^(?<vorKlammer>[^\[]+)\[(?<inKlammer>[^\\]+)\](?<nachKlammer>.*)$

Und das Pattern passt zu allen Plus-Zeichen zwischen den runten Klammern:
Zitat:
\)\s+\+\s\(


Vorgehen wäre also wie folgt:
Nimm das erste Pattern, greif dir die drei Gruppen raus, dann hast Du die Teile vor, in und nach den eckigen Klammern.
Auf den Inhalt in den eckigen Klammern machst Du dann ein Regex-Ersetzen mit dem zweiten Pattern und ersetzt es mit Zeilenumbrüchen - vergiss aber nicht, die Klammern zu ergänzen, die werden nämlich auch ersetzt.

Das Ergebnis wären mehrere Zeilen, in denen die einzelnen zu addierenden Teile stehen.
Das alles kannst Du dann nach, was auch immer Du für Regeln hast, wieder zusammensetzen.

Schön ist die Lösung nicht und sobald sich nur ein bisschen an der Formel ändert, wird es vermutlich scheitern, aber dafür ist es einfach.
Schöner wäre das Parsen der Formel, allerdings müsste man dann eigentlich auch mathematisch korrektes splitten können und dann wirds schnell sehr komplex - als ob das Parsen alleine nicht schon komplex genug wäre.
So eine unschöne Lösung fällt im Code wenigstens auf.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4507
Erhaltene Danke: 929


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 27.01.21 21:26 
Zitat:
Schöner wäre das Parsen der Formel, allerdings müsste man dann eigentlich auch mathematisch korrektes splitten können und dann wirds schnell sehr komplex - als ob das Parsen alleine nicht schon komplex genug wäre.


Ähnliches Problem wie beim Regex. Sobald man eine genaue Definition hat ist auch der Parser relativ einfach.
Oder anders ausgedrückt sobald eine BNF der Syntax vorliegt (grob das äquivalent zum Regex Ausdruck) ist das generieren simpel es gibt genug Generatoren dafür.

Hier ist eher das Problem das alexpj nicht genau weiß was er braucht. Weder an der Quelle zum parsen noch beim Ziel ob da das geparste überhaupt ebenso funktioniert.
Da bleibts dann halt schwer.
alexpj Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 29.01.21 20:45 
so, ich habe etwas geforscht. Die Maßkette ist eine gaußsche Polygonberechnung.

insofern gibt es gewisse facts:
Gaußsche Formel: Polygonanzahl * [(y1+y2)*(x1-x2) + (y2+y3)*(x2-x3) + usw...]*0,5

in meiner Kette hat der Entwickler aber nur Additionen verwendet und das offensichlich dann mit negativen Vorzeichen geregelt
Realität: Polygonanzahl * [(y1+y2)*(-x2+x1) + (y2+y3)*(-x3+x2) + usw...]*0,5

Hilft das eventuell weiter?

Schönes WE und bleibt gesund!
Alex
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1217
Erhaltene Danke: 160

Windows 10 x64 Home Premium
C# (Visual Studio Preview)
BeitragVerfasst: Fr 29.01.21 20:51 
Dann würde mein erster Ansatz mit Regex doch funktionieren?

Für diesen Beitrag haben gedankt: alexpj
alexpj Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Sa 06.02.21 00:59 
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Dann würde mein erster Ansatz mit Regex doch funktionieren?

Ja, vielen Dank für den Ansatz!