使用 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 '(' 和 ')'...
我有一个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 '(' 和 ')'...