1

簡単に言うと、ファイルからコンマ区切りの値をstlベクトルに読み取るルーチンを作成しようとしています。これは正常に機能します。csvファイルの値も二重引用符で囲まれている可能性があるため、これらもトリミングして処理しました。ただし、引用符の間の値に、区切り文字として扱われないコンマが含まれている可能性があるという問題が1つあります。

その行を含むファイルがある場合

"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);

この関数は半閉鎖間隔を取ります。つまり、消去する間隔の「終了」は、消去する最後の要素の 1 つ後ろを指す必要があります。あなたの場合、それはその要素を指しています。2 番目の引数を に変更しm_vecFields.begin()+x+offset+1ます。

x += offset;

アイテムを処理して次のアイテムまですべて削除したので、offsetここでアイテムをスキップしないでください。ループからはx++うまくいきます。

于 2012-06-14T13:05:22.043 に答える