1

简而言之,我正在尝试编写一个例程,将文件中的逗号分隔值读取到 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;
}

编辑:我发现了一些我将要更正的代码问题,但它们不会影响所提出的问题。

4

1 回答 1

2
m_vecFields.erase(m_vecFields.begin()+x+1, m_vecFields.begin()+x+offset);

此函数采用半封闭间隔,这意味着要擦除的间隔的“结束”应该指向要擦除的最后一个元素的过去。在您的情况下,它指向该元素。将第二个参数更改为m_vecFields.begin()+x+offset+1.

x += offset;

由于您刚刚处理了一个项目并删除了直到下一个项目的所有内容,因此您不应offset在此处跳过项目。x++from 循环就可以了。

于 2012-06-14T13:05:22.043 回答