Hallo Forum, ich habe hier gerade eine Problem bei dem mir der Lösungsansatz fehlt, dieses ligt vor allem darin das ich bisher noch nicht so viel mit QT gemacht habe, ein paar Grundlagen sind aber vorhanden. Nun zu dem was ich machen möchte, ich habe eine csv datei bsb.: "portB","pin1","eingangA", "portA","pin2","eingangB", "portA","pin1","eingangC" Hier möchte ich die Daten einlesen, dann erst nach Port und dann nach Pin sortieren, und anzuschließend die Daten etwas gewandelt wieder ausgeben. Das Ausgeben stellt kein Problem dar, das Einlesen der Datei auch nicht. Die Frage die sich mir stellt, in was für einen QT_Datentyp wandele ich es am besten und wie geht das sortieren dann? QStrinList? QTableWidget? Ich brauche die Daten nicht grafisch in Form einer Tabelle. Ich wüste wie ich das ganze in C umsetzen kann, aber ich denke das es in QT schon Funktionen gibt die das ganze eleganter und einfacher machen. schon einmal vielen Dank für die Hilfe
Hängt etwas von der Datenmenge ab. Wenn das gut ins RAM passt, QTableWidget mit QStandardItemModel. https://doc.qt.io/qt-5/qstandarditemmodel.html#sort Bzw über die Table, ggfs. dynamisch, "sortingEnabled": https://doc.qt.io/qt-5/qtableview.html#sortByColumn
neuling_in_qt schrieb: > Hier möchte ich die Daten einlesen, dann erst nach Port und dann nach > Pin sortieren, und anzuschließend die Daten etwas gewandelt wieder > ausgeben. Das geht übrigens ganz ohne Zusatz-Software mit Hausmitteln. "sort < input.csv > output.csv" ggfs. mit parametern für field-sepeartor, numeric sort usw. https://www.man7.org/linux/man-pages/man1/sort.1.html
Εrnst B. schrieb: > Das geht übrigens ganz ohne Zusatz-Software mit Hausmitteln. > "sort < input.csv > output.csv" vielen Dank, aber leider bin ich gerade auf Win unterwegs, und zum anderen ist es ein (mini) Teil von einem größeren Programm Εrnst B. schrieb: > Hängt etwas von der Datenmenge ab. Wenn das gut ins RAM passt, > QTableWidget mit QStandardItemModel. > > https://doc.qt.io/qt-5/qstandarditemmodel.html#sort > > Bzw über die Table, ggfs. dynamisch, "sortingEnabled": > > https://doc.qt.io/qt-5/qtableview.html#sortByColumn auch dafür vielen Dank, es handelt sich letztendlich wenn es hoch kommt, vielleicht um 200 Zeilen, da sollte es absolut keine Probleme mit dem RAM geben.
neuling_in_qt schrieb: > vielen Dank, aber leider bin ich gerade auf Win unterwegs, da heist dass Teil "sort.exe", und lässt sich ebenfalls als "sort" aufrufen. (Krasse 1980er-Technik!) Nur die Parameter sind z.T. anders. neuling_in_qt schrieb: > und zum > anderen ist es ein (mini) Teil von einem größeren Programm Sollen die Werte denn tabellarisch angezeigt werden oder nur als Datei Rein/Raus? Simple Liste (std::list oder QList) und einen eigenen Vergleichsoperator?
Es muss nicht grafisch dargestellt werden, viel mehr soll es nachher die Wandlung in ein c -structarray werden so in der Form: myStruct[] = { {PORT_A,1,"eingangC"}, {PORT_A,2,"eingangB"}, {PORT_B,1,"eingangA"}, }; , wobei mir die Ausgabe nicht das Problem machen wird. Ich frage hier ja nach, weil mir der "richtige" Ansatz fehlt. Ich habe mir die Geschichte mit QTableWidget mal angesehen, aber so richtig einfach wird das auch nicht, hätte jetzt auf ein QTableWidget myTable = myTextStream.readTableContent(",", "\r") oder eine Methode readFromCsv oder irgend so etwas erhofft. Aber die Beispiele die ich gesehen habe gehen dann ja "klassisch über for schleifen.
Die Qt-Container und auch die der std lib funktionieren alle mit std::sort. Also lies die Daten in eine Container deiner Wahl ein, lass da ein std::sort drüber laufen, und gib sie wieder aus. In Qt wäre wäre das ein QList<Qstring, QString, Qstring>, du kannst aber genauso gut (oder besser) einen std::vector<QString, QString, QString> nehmen, oder auch einen auf std::string. Das Problem ist eigentlich völlig unabhängig von Qt, und lässt sich alleine mit der Standardlib lösen. QTableWidget und alles andere, was ein WIdget ist, sind Datentypen zur Visusalisierung. Die haben mit der Lösung deines Problmes nichts zu tun. Oliver
:
Bearbeitet durch User
Wenn die Daten immer im selben Spaltenformat sind, würde ich eine Klasse definieren, die die Werte aufnehmen kann und die auch gleich das Parsen einer Zeile erledigt. Wenn man dafür einen operator< definiert, der beim Vergleich zweier Instanzen deiner Klasse zurückgibt, welche Kombination aus port und pin als "kleiner" gilt, kann man sie in einen beliebigen Container stecken und mit dessen Sortierfunktion bzw. std::sort entsprechend sortieren. Wenn man ein QSet oder std::set nimmt, werden sie schon beim Einfügen automatisch passend einsortiert. Oliver S. schrieb: > In Qt wäre wäre das ein QList<Qstring, QString, Qstring>, QList hat genau einen Template-Paramter. Man könnte aber eine QList<QStringList> machen. > du kannst aber genauso gut (oder besser) einen std::vector<QString, QString, > QString> std::vector hat zwei Template-Paramter, einmal den Elementtyp und einmal den zu verwendenden Allocator.
:
Bearbeitet durch User
Rolf M. schrieb: >> du kannst aber genauso gut (oder besser) einen std::vector<QString, QString, >> QString> > > std::vector hat zwei Template-Paramter, einmal den Elementtyp und einmal > den zu verwendenden Allocator. War zu schnell hingeschludert. Da muß natürlich noch sowas wie ein std::array<QString, 3> o.ä. dazwischen. Man könnte für die Zeile auch ein QStringList nehmen. Das brächte dann zwar einen Vergleichsoperator mit, wäre aber in der Länge undefiniert, und die vordefinierten lexikalischen Vergleiche tun nicht immer das, was man sich vorstellt. Oliver
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.