Table cordinates sortieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
spike78
User
Beiträge: 8
Registriert: Freitag 5. November 2010, 11:14

Hallo zusammen,

ich tüftele schon ne ganze Weile an einem Problem und finde keine richtige Lösung. In der Suche konnte ich leider auch nicht viel finden.

Also hier mein Problem.

Ich habe eine Tabelle von der ich mir das Dataset auslesen lasse.

Code: Alles auswählen

table = rc.getComponent("DropTarget_client.dnd.ZDropTarget3")
model = table.getModel()
output = model.dataSet
Dieses Dataset speichere ich mir nun in eine exterene Datei. Das Problem dabei ist nur, das die cordinates darin immer in unterschiedlicher Reihenfolge rausgeschrieben werden.
Hier mal ein Beispiel meiner extrahierten Datei:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<dataset>
	<coordinate index="1">
		<resultcriterion usage="ITERATION">
			EKP-ID
			<criterion name="EPKID" relation="PROCESS_ONLY">EKP-ID</criterion>
			<iterationinfo />
		</resultcriterion>
		<dataitem value="9221">
			9.221
			<datatype name="LONG">Ganzzahl</datatype>
		</dataitem>
	</coordinate>
	<coordinate index="2">
		<resultcriterion usage="ITERATION">
			Prozesskennzeichnung
			<criterion name="ATID" relation="PROCESS_ONLY">Prozesskennzeichnung</criterion>
			<iterationinfo />
		</resultcriterion>
		<dataitem>
			UMG#0000000080-3_3453564
			<datatype name="TEXT">Text</datatype>
		</dataitem>
	</coordinate>
	<coordinate index="3">
		<resultcriterion usage="KEYINDICATOR">
			Prozessanzahl
			<criterion name="PNUM" relation="PROCESS_ONLY">Prozessanzahl</criterion>
		</resultcriterion>
		<dataitem value="1">
			1
			<datatype name="LONG">Ganzzahl</datatype>
		</dataitem>
	</coordinate>
	<dsrow>
		<dsvalue index="1">
			<dataitem value="9221">
				9.221
				<datatype name="LONG">Ganzzahl</datatype>
			</dataitem>
		</dsvalue>
		<dsvalue index="2">
			<dataitem>
				UMG#0000000080-3_3453564
				<datatype name="TEXT">Text</datatype>
			</dataitem>
		</dsvalue>
		<dsvalue index="3">
			<dataitem value="1">
				1
				<datatype name="LONG">Ganzzahl</datatype>
			</dataitem>
		</dsvalue>
	</dsrow>
</dataset>
Das Problem ist nun, das einmal zuerst "EKP-ID" oben steht, beim nächstenmal steht er wieder in der Mitte oder ganz unten. Für mich ist aber ganz wichtig, dass meine Datei bei jedem extrahieren immer den gleichen Aufbau (Reihenfolge) hat.

Die cordinates nehme ich mir so:

Code: Alles auswählen

cordinates = output.coordinates
cordinates bietet mir dabei diese Methoden:

['__init__', 'add', 'addAll', 'class', 'clear', 'clone', 'contains', 'containsAll', 'empty', 'ensureCapacity', 'equals', 'get', 'getClass', 'hashCode', 'indexOf', 'isEmpty', 'iterator', 'lastIndexOf', 'listIterator', 'notify', 'notifyAll', 'remove', 'removeAll', 'retainAll', 'set', 'size', 'subList', 'toArray', 'toString', 'trimToSize', 'wait']

Ich hoffe ihr könnt mir da weiterhelfen.

Danke und Grüße

Spike
BlackJack

@spike78: Wo kommen denn diese Typen her? Was ist `rc`? Wenn etwas nichts offensichtlich aus der Standardbibliothek ist, oder die Wahl des Unterforums hier keinen deutlichen Hinweis gibt, sollte man immer erwähnen worum es überhaupt geht.

Wie ist denn das XML-Format definiert? Wenn es keine Garantien für die Reihenfolge dieser Elemente gibt, sollte man nicht versuchen sie beim Rausschreiben in eine Reihenfolge zu bringen, sondern besser bei der Weiterverarbeitung dafür sorgen, dass man mit jedweder (erlaubten) Reihenfolge klar kommt.
spike78
User
Beiträge: 8
Registriert: Freitag 5. November 2010, 11:14

Hi,

also ich verwende das Testtool QF-Test um eine Java Anwendung testen zu können. Mit diesem Tool hat man die Möglichkeit eigene Python Scripte zu schreiben. Das rc kommt von diesem Tool und ist dafür zuständig um sich die Objekte geben zu lassen. Da ich für meinen Vergleich aber das Kommandozeilentool comp verwende, bin ich auf eine bestimmte Reihenfolge leider angewiesen :(

Viele Grüße

Spike
BlackJack

@spike78: Wie wird denn das XML erzeugt? Machst Du das selbst? Dann musst Du die Koordinaten doch vorher nur nach irgend einem eindeutigen Kriterium sortieren.
spike78
User
Beiträge: 8
Registriert: Freitag 5. November 2010, 11:14

Hi,

hier mal der Code wie ich die Reihenfolge versucht habe zu ändern:

Code: Alles auswählen

from javax.swing import *
from java.util.ArrayList import *
from com.idsscheer.ppm.client.user.components import *

table = rc.getComponent("DropTarget_client.dnd.ZDropTarget3")
model = table.getModel()
col1 = table.getColumnName(0)
output = model.dataSet

# Spalten in richtige Reihenfolge bringen
if col1 == "Prozessanzahl":
    table.moveColumn(0, 1)  
cordinates = output.coordinates

L = []
for index in range(len(cordinates)):
    if cordinates[index].getCriterion().toString() == "PNUM":
        L.insert(0, cordinates[index]) 
    if cordinates[index].getCriterion().toString() == "ATID PROCESS_ONLY":
        L.insert(1, cordinates[index]) 
    if cordinates[index].getCriterion().toString() == "EPKID PROCESS_ONLY":
        L.insert(2, cordinates[index]) 
        
for index in range(len(L)):
    print L[index].getCriterion(),
    print `index`


for index in range(len(cordinates)):
    print cordinates[index].getCriterion(),
    print `index`

#print dir(output)

output.setCoordinateList(L)
Dies führt in der letzten Anweisung (output.setCoordinateList(L) allerdings zu dem Fehler "TypeError: setCoordinateList(): 1st arg can't be coerced to java.util.ArrayList"

Und hier mal der Code für das Schreiben der XML:

Code: Alles auswählen

fobj_out = open("${startoptions:bindir}/dataset_osid_30287_before_compress.xml" ,"w")
fobj_out.write(output.toString())
fobj_out.close()
Grüße

Spike
BlackJack

@spike78: Ich habe mal kurz über's sortieren dort nachgedacht und bei drei Elementen könnte das vielleicht sogar so funktionieren, aber bei mehr bin ich mir nicht mehr sicher. Zumal das ziemlich kompliziert und langwierig ausgedrückt ist. Listen haben eine `sort()`-Methode und es gibt `sorted()` um eine sortierte Liste aus einem "iterable" zu erstellen. Beide haben ein `key`-Argument wo man eine Funktion angeben kann, die aus den Elementen einen Sortierschlüssel erzeugt, um nach beliebigen Kriterien sortieren zu können.

Ich weiss nicht was das Programm als Anbindung an Java verwendet -- Jython müsste eine Python-`list` AFAIK automatisch in eine `java.util.ArrayList` umwandeln können. Das müsstest Du sonst hier halt selbst machen.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Dein Code sollte eher so aussehen (ungetestet):

Code: Alles auswählen

from java.util import ArrayList

table = rc.getComponent("DropTarget_client.dnd.ZDropTarget3")
if table.getColumnName(0) == "Prozessanzahl":
    table.moveColumn(0, 1)  

output = table.getModel().dataSet
lookup = {'PNUM':0, 'ATID PROCESS_ONLY':1, 'EPKID PROCESS_ONLY':2}
result = ArrayList([None] * 3) # bin nicht ganz sicher, ob das so geht
for coor in output.coordinates:
    index = lookup.get(coor.getCriterion().toString())
    if index is not None:
        result.set(index, coor)

assert None not in result

for index, coor in enumerate(result): # ist ArrayList überhaupt iterable??
    print coor.getCriterion(), index

for index, coor in enumerate(coordinates):
    print coor.getCriterion(), index

output.setCoordinateList(result)
Python ist nicht Java.

Und vergiss die Backticks am besten gleich wieder. Auszug aus PEP3099: "Backticks (`) will no longer be used as shorthand for repr -- but that doesn't mean they are available for other uses. Even ignoring the backwards compatibility confusion, the character itself causes too many problems (in some fonts, on some keyboards, when typesetting a book, etc)."
In specifications, Murphy's Law supersedes Ohm's.
spike78
User
Beiträge: 8
Registriert: Freitag 5. November 2010, 11:14

Hi,

damit gehts :D

Vielen Danke und Grüße

Spike
Antworten