2016-06-08 5 views
0

У меня есть файл CSV и некоторые из текста в нем следующим образом:Populate структура с, специфические данные из 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) 

Я использую Qt и выбрали все данные из CSV в QStringList где каждый элемент QStringList является одной строкой из csv.

Я определил структуру, как показано ниже:

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

и теперь мое намерение состоит в том, чтобы отсканировать хотя список QString и для каждой строки, которая начинается с sendLink, я должен прочитать немедленные следующие строки, которые начинаются с PATH , сохраните второй элемент (device_1, device_3) в outputESResource, а затем загляните в строки после строки PATH и выберете предыдущий столбец (device_2) в этом примере и сохраните его в inputESResource.

Для этого, я ищу через StringList строки, начинающиеся с PATH следующим образом:

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

Я не уверен, что это правильный путь для реализации этого. Может ли кто-нибудь проконсультироваться с ним.

+0

Возможный дубликат [Анализ через файл csv в Qt] (http: // stackoverflow .com/questions/27318631/parsing-through-a-csv-file-in-qt) –

ответ

1

Из чего я понимаю ... вот какой-то псевдокод, который может вам помочь. Нет ничего плохого в вашей идее Я думаю, не знаю, как вы читаете из файла, но нет никакой реальной необходимости немедленно использовать QString - обычно QIODevice :: readLine возвращает QByteArray, которые так же хороши, как QString для такого рода вещь ...

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

Примечание: Не установлено и не протестировано - нет оригинальной версии. Также существует слишком много неизвестных для того, что вы хотите сделать с этой информацией, так что я не пытался хранить Pathinfo везде ...

Редактировать

Я добавил немного петли для добавления PATH линии всех вместе и удалить пробел и// s, а также тот же код, который удаляет '(' и ')' ...

+0

Здесь все еще есть один улов. Каждая строка из csv сохраняется как отдельная строка, поэтому я не могу предположить, что позиции равны 0 и 10. Я уверен в device_4, device_7 и т. Д., Так как они находятся в той же строке, что и PATH. Но device_2 не является той же строкой, и я должен получить это значение. Я не уверен, как решить эту проблему. – smyslov

+0

@smyslov ok, я добавил немного больше. Во-первых, все чтения из файла теперь обрезают белое пространство от концов каждой строки - это всегда полезно. Также я добавил небольшую петлю, чтобы перестроить PATH в одну строку с '\', '(' и ')' все удалены ... Теперь ваш формат должен быть правильным. Но вам не нужно использовать [0] и [10], вы можете использовать дополнительные функции, чтобы найти, где находится каждое устройство. Я просто не понимаю ваши правила точно, поэтому я сделал предположение, но посмотрите на: 'indexOf()' и 'lastIndexOf()' для того, чтобы получить первое и последнее устройство или просто пропустить ваш вектор –