简而言之,我正在尝试编写一个例程,将文件中的逗号分隔值读取到 stl 向量中。这工作正常。csv 文件中的值也可能用双引号引起来,所以我也通过修剪它们来处理这个问题。但是,有一个问题是引号之间的值也可能包含逗号,这些逗号不能被视为分隔符。
如果我有一个包含该行的文件
"test1","te,st2","test3","test4"
我的文件例程将其读入向量中
"test1"
"te
st2"
"test3"
"test4"
我写了一个例程,我刚刚称之为 PostProcessing。这将通过向量并纠正此问题。它将获取每个元素,并检查第一个值是一个引号。如果是这样,它将删除它。然后它会在字符串的末尾寻找另一个引号。如果它找到一个,它将删除它并移动到下一个项目。如果没有找到,它将继续遍历向量,将以下所有项合并在一起,直到找到下一个引用。
但是,这可以将“te 和 st2”合并到元素 2(索引 1)中,但是当我尝试从向量中删除所需的元素时,它必须失败,因为结果向量输出如下:
test1
test2
st2"
test3
"test4"
还要注意最后一个元素没有被处理,因为我减少了计数的大小,但是由于向量擦除失败,真正的计数实际上并没有改变。
后处理代码如下。我究竟做错了什么?
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;
}
编辑:我发现了一些我将要更正的代码问题,但它们不会影响所提出的问题。