Forum: PC-Programmierung wie Tabellen in qt sortieren


von neuling_in_qt (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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

von neuling_in_qt (Gast)


Lesenswert?

Ε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.

von Εrnst B. (ernst)


Lesenswert?

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?

von neuling_in_qt (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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
von Rolf M. (rmagnus)


Lesenswert?

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
von Oliver S. (oliverso)


Lesenswert?

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
Noch kein Account? Hier anmelden.