2016-06-08 5 views
0

Ich habe eine CSV-Datei und ein Teil des Textes in es wie folgt:Populate Struktur mit specifc Daten aus QStringList

sendLink, 23, VL_name1, 0.5, 0.5 
PATH, (device_1, 1, SW1, 10),\ 
     (SW_2, 23, SW_1, 23),\ 
     (SW_1, 9, device_2, 1) 
PATH, (device_3, 2, SW_12, 10),\ 
     (SW_12, 23, SW_11, 23),\ 
     (SW_11, 9, device_2, 2) 

sendLink, 24, VL_name2, 0.5, 0.5 
PATH, (device_4, 1, SW_09, 24),\ 
     (SW_01, 9, device_2, 1) 
PATH, (device_5, 2, SW_19, 24),\ 
     (SW_11, 9, device_2, 2) 

sendLink, 25, VL_name3, 0.5, 0.5 
PATH, (device_7, 1, SW_09, 24),\ 
     (SW_09, 17, SW_01, 24),\ 
     (SW_01, 9, device_2, 1) 
PATH, (device_8, 2, SW_19, 24),\ 
     (SW_19, 17, SW_11, 24),\ 
     (SW_11, 9, device_2, 2) 

ich Qt bin mit und haben alle Daten aus der CSV in eine QStringList geholt, wo Jedes Element von QStringList ist eine Zeile von der CSV.

Ich habe eine Struktur wie unten definiert:

typedef struct{ 
    QString outputESResource; 
    QString inputESResource; 
} Path_t; 

und jetzt meine Absicht ist, obwohl die QString Liste zu scannen und für jede Zeile, die mit Sendlink beginnt, soll ich die unmittelbaren nächsten Zeilen lesen, die mit PATH starten Speichern Sie das zweite Element (device_1, device_3) in outputESResource und suchen Sie dann in den Zeilen nach der PATH-Zeile und holen Sie die vorletzte Spalte (device_2) in diesem Beispiel und speichern Sie sie in inputESResource.

Hierzu ich durch den String für Linien bin auf der Suche mit PATH beginnen wie folgt:

for(int i=0; i < fileContents.count(); i++) 
{ 
    if(fileContents[i].startsWith("PATH", Qt::CaseSensitive)) 
    { 
    //scan next element in stringlist 
    } 
} 

Ich bin nicht sicher, ob dies der richtige Weg ist, um dies zu implementieren. Könnte jemand bitte Ratschläge dazu geben.

+0

Mögliche Duplikate von [Parsen durch eine CSV-Datei in Qt] (http: // Stackoverflow .com/questions/27318631/Parsing-durch-a-csv-Datei-in-qt) –

Antwort

1

Von was ich verstehe ... hier ist ein Pseudo-Code, der Ihnen helfen kann. Es ist nichts falsch mit Ihrer Idee Ich denke, nicht sicher, wie Sie aus Datei lesen - aber es gibt keine echte Notwendigkeit, QString sofort zu verwenden - in der Regel QIODevice :: readLine gibt eine QByteArray, die genau so gut wie QString für diese Art sind sache ...

Path_t pathInfo; 

while (!file.atEnd()) { 
    QByteArray line = file.readLine().trimmed(); // remove white space at ends 
    if (line.startsWith("sendLink")) 
    { 
     // do sendLink stuff... 
     // maybe you need to assign a new pathInfo...? 
    } 
    else if (line.startsWith("PATH") 
    { 
     // now get the rest of the PATH line. This should keep reading 
     // and appending lines until there is no '\' at the end. 
     while (line.endsWith("\")) 
     { 
      // remove the "\" from the end 
      line.chop(1); 
      // Read the next line (trim white space) 
      line.append(file.readLine().trimmed()); 
     } 
     // assuming you don't want the brackets? 
     line.remove('('); 
     line.remove(')'); 
     // split the line 
     QList<QByteArray> words = line.split(','); 
     // populate your struct - assuming that the positions are always 0 and 10... 
     // otherwise you will have to parse this bit too 
     pathInfo.outputESResource = words[0].toLatin1(); // convert to QString for your struct 
     pathInfo.inputESResource = words[10].toLatin1(); // convert to QString for your struct 

     // do something with pathInfo.... 
    } 
} 

Hinweis: Nicht gebaut oder getestet - haben Sie nicht Ihre ursprüngliche kompatible Version. Auch gibt es zu viele Unbekannte für das, was Sie wollen mit dieser Information zu tun, damit ich nicht pathInfo versucht haben, überall zu speichern ...

bearbeiten

Ich habe eine kleine Schleife hinzugefügt, um die PATH-Zeile alle anhängen zusammen und entfernen Leerraum und '/' s - sowie den gleichen Code, der entfernt '(' und ')' ...

+0

Es gibt noch einen Haken hier. Jede Zeile von der CSV wird als eine separate Zeichenfolge gespeichert, weshalb ich nicht davon ausgehen kann, dass die Positionen 0 und 10 sind. Ich bin sicher über die Device_4, Device_7 etc, da sie in der gleichen Zeichenfolge wie PATH sind. Aber Device_2 ist nicht die gleiche Zeichenfolge und ich soll diesen Wert holen. Ich bin mir nicht sicher, wie man mit diesem Problem umgehen kann – smyslov

+0

@smyslov ok, ich habe ein bisschen mehr hinzugefügt. Zuerst werden alle Lesevorgänge aus der Datei den weißen Bereich von den Enden jeder Zeile entfernt - das ist immer sehr nützlich. Außerdem habe ich eine kleine Schleife hinzugefügt, um den PATH in eine Zeile umzuwandeln, wobei '\', '(' und ')' alle entfernt wurden ... Nun sollte Ihr Format korrekt sein. Aber Sie müssen [0] und [10] nicht verwenden, Sie können weitere Funktionen verwenden, um herauszufinden, wo sich jedes Gerät befindet. Ich verstehe deine Regeln einfach nicht, also habe ich eine Vermutung gemacht, aber sieh dir an: 'indexOf()' und 'lastIndexOf()', um dorthin zu gelangen, wo das erste und letzte Gerät ist oder einfach durch deinen Vektor laufen –

Verwandte Themen