简单地说,我正在尝试编写一个例程,将文件中的逗号分隔值读入stl向量。这很好用。 csv文件中的值也可能是双引号,所以我也通过修剪它们来处理它。但是,有一个问题,即引号之间的值也可能包含逗号,这些逗号不应被视为分隔符。
如果我有一个包含该行的文件
"test1","te,st2","test3","test4"
我的文件例程将其读入矢量
"test1"
"te
st2"
"test3"
"test4"
我写了一个例程,我刚才叫做PostProcessing。这将通过向量并纠正此问题。它需要每个元素并检查第一个值是否为引号。如果是这样,它将删除它。然后它会在字符串的末尾查找另一个引号。如果它找到一个它只会删除它并移动到下一个项目。如果它没有找到一个,它将继续通过向量合并所有以下项目,直到它确实找到下一个引用。
然而,这可以将“te和st2”合并到元素2(索引1)中,但是当我尝试从向量中擦除所需的元素时,它必须失败,因为结果向量输出如下:
test1
test2
st2"
test3
"test4"
另请注意,最后一个元素尚未处理,因为我对计数的大小进行了处理,但由于向量擦除失败,真正的计数实际上没有改变。
PostProcessing代码如下。我做错了什么?
bool MyClass::PostProcessing()
{
bool bRet = false;
int nCount = m_vecFields.size();
for (int x = 0; x < nCount; x++)
{
string sTemp = m_vecFields[x];
if (sTemp[0] == '"')
{
sTemp.erase(0,1);
if (sTemp[sTemp.size()-1] == '"')
{
sTemp.erase(sTemp.size()-1, 1);
m_vecFields[x] = sTemp;
}
else
{
// find next double quote and merge these vector items
int offset = 1;
bool bFound = false;
while (x+offset < nCount && !bFound)
{
sTemp = sTemp + m_vecFields[x+offset];
if (sTemp[sTemp.size()-1] == '"')
{
// found corresponding "
sTemp.erase(sTemp.size()-1,1);
bFound = true;
}
else
{
offset++;
}
}
if (bFound)
{
m_vecFields[x] = sTemp;
// now remove required items from vector
m_vecFields.erase(m_vecFields.begin()+x+1, m_vecFields.begin()+x+offset);
nCount -= offset;
}
}
}
}
return bRet;
}
编辑:我发现了一些代码问题,我将对其进行更正,但这些问题不会影响被问到的问题。
答案 0 :(得分:2)
m_vecFields.erase(m_vecFields.begin()+x+1, m_vecFields.begin()+x+offset);
此函数采用半闭区间,这意味着要擦除的区间的“结束”应指向要擦除的最后一个元素的一个。在您的情况下,它指向该元素。将第二个参数更改为m_vecFields.begin()+x+offset+1
。
x += offset;
由于您刚刚处理了一个项目并删除了下一个项目的所有内容,因此您不应在此处跳过offset
个项目。循环中的x++
会很好。