使用 QStringList 中的特定数据填充结构

Populate struct with specifc data from QStringList

我有一个csv文件,里面的一些文字如下:

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

我不确定这是否是正确的实现方式。有人可以请教一下吗。

据我了解...这里有一些可能对您有所帮助的伪代码。 我认为你的想法没有错,不确定你是如何从文件中读取的 - 但没有真正需要立即使用 QString - 通常 QIODevice::readLine returns 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 行全部附加到一起并删除白色 space 和 '/'s - as well as the same code that removes '(' 和 ')'...