Solved textFile lesen zeile für zeile
-
Hallo zusammen,
ich habe folgende datei, die ich gerne auswerten möchte. [0_1508821765126_curve_Wafer_X_1790.log](Lade 100% hoch)
Das text File sieht so aus:
Mo. Okt 23 2017 09:25:42 (01,01) -0.5 -0 0 -0 0 0 -0 -0
Mo. Okt 23 2017 09:26:27 (01,01) -1.0 -0 -0 0 -0 0 0 0
Mo. Okt 23 2017 09:52:09 (01,01) -0.5 0 -0 0 0 0 -0 0
Mo. Okt 23 2017 09:52:17 (01,01) -1.0 -0 -0 0 0 -0 0 0
Mo. Okt 23 2017 09:52:24 (01,01) -1.5 0 -0 -0 0 0 -0 0
Mo. Okt 23 2017 09:52:25 (01,01) -2.0 -0 -0 0 0 -0 0 0
Mo. Okt 23 2017 09:52:25 (01,01) -2.5 -0 0 -0 -0 0 0 -0
Mo. Okt 23 2017 09:52:25 (01,01) -3.0 -0 0 -0 -0 0 0 -0
Mo. Okt 23 2017 09:52:26 (01,01) -3.5 -0 0 -0 0 0 -0 -0
Mo. Okt 23 2017 09:52:26 (01,01) -4.0 -0 0 -0 0 0 -0 0
Mo. Okt 23 2017 09:52:27 (01,01) -4.5 0 -0 -0 0 0 -0 0
Mo. Okt 23 2017 09:52:27 (01,01) -5.0 -0 -0 -0 0 -0 -0 0
Mo. Okt 23 2017 09:52:29 (01,02) -0.5 -181 -189 -133 0 -134 -186 -185
Mo. Okt 23 2017 09:52:29 (01,02) -1.0 -184 -191 -135 0 -136 -189 -187
Mo. Okt 23 2017 09:52:30 (01,02) -1.5 -186 -193 -136 0 -138 -191 -189
Mo. Okt 23 2017 09:52:30 (01,02) -2.0 -187 -194 -136 0 -139 -192 -190
Mo. Okt 23 2017 09:52:31 (01,02) -2.5 -188 -195 -137 -0 -139 -193 -191
Mo. Okt 23 2017 09:52:31 (01,02) -3.0 -189 -196 -138 -0 -140 -194 -192
Mo. Okt 23 2017 09:52:31 (01,02) -3.5 -189 -196 -138 0 -140 -194 -192
Mo. Okt 23 2017 09:52:32 (01,02) -4.0 -190 -197 -139 0 -140 -195 -193
Mo. Okt 23 2017 09:52:32 (01,02) -4.5 -190 -198 -139 0 -141 -195 -193
Mo. Okt 23 2017 09:52:33 (01,02) -5.0 -191 -198 -139 -0 -141 -196 -194
Mo. Okt 23 2017 09:52:34 (02,02) -0.5 -147 -159 -125 -183 -117 -173 -172
Mo. Okt 23 2017 09:52:35 (02,02) -1.0 -151 -163 -128 -188 -120 -178 -177
Mo. Okt 23 2017 09:52:35 (02,02) -1.5 -153 -166 -130 -191 -122 -181 -179
Mo. Okt 23 2017 09:52:35 (02,02) -2.0 -155 -168 -131 -193 -123 -183 -181
Mo. Okt 23 2017 09:52:36 (02,02) -2.5 -157 -170 -132 -195 -125 -185 -184
Mo. Okt 23 2017 09:52:36 (02,02) -3.0 -158 -171 -133 -196 -125 -186 -185
Mo. Okt 23 2017 09:52:37 (02,02) -3.5 -159 -172 -134 -197 -126 -187 -186
Mo. Okt 23 2017 09:52:37 (02,02) -4.0 -160 -173 -134 -198 -127 -188 -187
Mo. Okt 23 2017 09:52:38 (02,02) -4.5 -161 -174 -136 -199 -127 -189 -189
Mo. Okt 23 2017 09:52:38 (02,02) -5.0 -162 -178 -136 -201 -128 -191 -193
Mo. Okt 23 2017 09:52:40 (02,01) -0.5 -254 -269 -223 -331 -210 -286 -287
Mo. Okt 23 2017 09:52:40 (02,01) -1.0 -259 -273 -226 -337 -213 -291 -291
Mo. Okt 23 2017 09:52:41 (02,01) -1.5 -261 -276 -228 -339 -214 -294 -294
Mo. Okt 23 2017 09:52:41 (02,01) -2.0 -264 -278 -229 -342 -216 -296 -296
Mo. Okt 23 2017 09:52:42 (02,01) -2.5 -265 -280 -231 -343 -217 -298 -298
Mo. Okt 23 2017 09:52:42 (02,01) -3.0 -266 -281 -231 -345 -218 -300 -300
Mo. Okt 23 2017 09:52:43 (02,01) -3.5 -267 -282 -233 -346 -219 -301 -301
Mo. Okt 23 2017 09:52:43 (02,01) -4.0 -268 -283 -233 -347 -219 -302 -302
Mo. Okt 23 2017 09:52:43 (02,01) -4.5 -269 -284 -234 -348 -220 -304 -303
Mo. Okt 23 2017 09:52:44 (02,01) -5.0 -270 -285 -235 -349 -220 -304 -304
Mo. Okt 23 2017 10:04:55 (01,01) -0.5 -0 0 -0 -0 0 0 -0Ich bin so vorgegangen:
QFile inputFile(currentPathName); if (inputFile.open(QFile::ReadOnly)) { QTextStream inputStream(&inputFile); while(!inputStream.atEnd()) { QString line = inputStream.readLine(); pos1 = line.indexOf('('); line.remove(0,pos1); if(line.contains("(01,01)", Qt::CaseInsensitive)) { QStringList mytlist = line.split("(01,01)", QString::SkipEmptyParts); // Bis hier habe ich z.B diese Form: -0.5 -158 -157 -129 -183 -124 0 -160 // Ich will dann jede String der QStringList in einem Vector einfügen z.B: // v1[-0.5],v2[-158],v3[-157],v4[-129],v5[-183],v6[-124],v7[0],v8[-160] // Beim lesen der zweiten zeile auch das gleiche tun also z.B: // v1[-0.5,-1],v2[-158,-160],v3[-157,-190],v4[-129,-130],v5[-183,-190],v6[-124,-130],v7[0,-150],v8[-160,-165] und soweiter // Grund nach dem Lesen möchte ich dann die Ergebnis plotten } if(line.contains("(02,02)", Qt::CaseInsensitive)) { ..... } ..... ```[0_1508822555241_curve_Wafer_X_1790.log](Lade 100% hoch)
-
@Galilio Moin, kann mir nicht helfen, aber das sieht so aus als ob du es dir zu einfach machst. Was ist überhaupt deine Frage? Weil dein Code sollte das TextFile Zeile für Zeile lesen, ohne Probleme.
Weil ich ne Vermutung habe:
QVector<double> stringToVector(const QString &str){ QVector<double> vResult; QString s = str.split("(01,01)",QString::KeepEmptyParts).last(); auto splitRef = s.splitRef(" "); for(auto item : splitRef) vResult.append(QString::number(item)); return vResult; }
-
meine Frage ist:
Wie kann ich den oberen txt file zeile lesen und die so in einem bestimmten Form formatieren wie z.B
if(line.contains("(01,01)", Qt::CaseInsensitive))// Hier werden 10 zeile gelesen
v1 = [-0.5 -1 -1.5 -2 -2.5 -3 -3.5 -4 -4.5 -5]
v2 = [-190 -150 -180 -167 -180 -165 -190 -180 -160 -150]
v3 = [....]...
v8 = [....]
if(line.contains("(02,02)", Qt::CaseInsensitive))
.... -
@J-Hilk
Ist meine Frage klar jetzt? -
@Galilio ja, und um mich selbst zu zitieren:
@J.Hilk said in textFile lesen zeile für zeile:
Weil ich ne Vermutung habe:
QVector<double> stringToVector(const QString &str){ QVector<double> vResult; QString s = str.split("(01,01)",QString::KeepEmptyParts).last(); auto splitRef = s.splitRef(" "); for(auto item : splitRef) vResult.append(QString::number(item)); return vResult; }
-
super danke
dazu eine Frage bitte, da ich qt4 verwende kann ich "auto" gar nicht benutzen. -
@Galilio auto hab ich nur der Schreibfaulheit halber geschrieben, war einige Zeichen kürzer:
QVector<double> stringToVector(const QString &str){ QVector<double> vResult; QString s = str.split("(01,01)",QString::KeepEmptyParts).last(); QVector<QStringRef> splitRef = s.splitRef(" "); foreach (QStringRef item, splitRef) vResult.append(QString::number(item)); return vResult; }
-
Sry, hab die falsche Funktion genommen!!!
Anstatt
vResult.append(QString::number(item));
sollte das
vResult.append(item.toDouble());
sein
-
@J.Hilk
ich bekomme folgende Fehlermeldung:
error C2039: 'splitRef' : is not a member of 'QString'Dieses fehler trifft dieses Zeile:
QVector<QStringRef> splitRef = s.splitRef(" ");
-
This function was introduced in Qt 5.4.
Wusste ja nicht das du mit Qt 4 arbeitest als ich das erstellt habe. Mach aus splitRef nen split aus QVector<QStringRef> mach QStringList und aus QStringRef mach QString
-
@J.Hilk
danke -
Sorry noch eine Frage:
ich möchte auch alle leere Strings löschen.
z.B ich habe folgende Zeil gelesen:
-0.5 0 0 0 0 0 0 0
Zweichen jeden Wert liegen immer 3 bis 4 leere Tasten und wenn ich so schreibe :QVector<double> vResult; QStringList splitList = str.split(" "); foreach (QString item, splitList) vResult.append(item.toDouble()); for(int i =0; i<vResult.size()-1; i++) { if(vResult[i] == 0) { vResult.remove(i); } qDebug() << "vResult[i] = "<<"i"<< i <<vResult[i]; return vResult; }
dann hat das splitList eine Länge von 34 und wie ich vorgegangen bin, ist falsch.
Es werden nicht alle leere Taste gelöscht.
sorry noch mal -
@Galilio Das Problem ist, wenn du split nutzt, brauchst du irgendwas, dass als Trennzeichen funktioniert. Häufig nimmt man dafür
,
oder;
wo auch der Begriff CSV-Datei herkommt. Comma separated Values.In der Datei die du gepostet hast, konnte ich als Trennzeichen nur ein Leerzeichen aus machen. split(' ') macht dann aus zwei Leerzeichen 2 Einträge mit Leeren Strings.
toDouble
gibt, wenn eine Umwandlung fehlgeschlagen ist - was es bei einem leeren String tut, 0.0 wieder.Das einfachste ist es wenn du das abfängst:
QVector<double> vResult; QStringList splitList = str.split(" "); foreach (QString item, splitList) if(!item.isEmpty()) vResult.append(item.toDouble()); return vResult;
du kannst auch eine variable dem
toDouble
übergeben, um zu sehen ob die Umrechnung erfolgreich war:QVector<double> vResult; QStringList splitList = str.split(" "); bool ok; foreach (QString item, splitList){ if(!item.isEmpty()){ vResult.append(item.toDouble(&ok)); qDebug() << "String to Double erfolgreich:" << ok; }else qDebug() << "Stringlist item war leer"; } return vResult;
-
@J.Hilk
vielen vielen dank