std :: getline用于逗号分隔的表文件,其中包含某些字段的引号

时间:2011-04-22 04:05:48

标签: c++ c++builder

我基本上运行以下代码。此代码逐行执行并获取通用逗号分隔表文件的不同字段。我的问题是,有时“标题”字段可以包含逗号。当它这样时,它被引号括起来:“这,这是我的头衔”。 但是当我的代码看到逗号时,它只会将其后的所有内容视为下一个字段。并非所有标题都有引号,只有引号括起来。我的问题是,我不知道如何使代码检查这....我怎样才能让我的代码检查这个问题?

非常感谢,你好。这对我的有酬工作意义重大!

while (getline(BookLine, ImpLine, '\n'))  // Get each line
{
   // create a string stream from the standard string
   std::istringstream StrLine(ImpLine);

   std::string
   bookNumber,
   chk,
   author,
   title,
   edition;

   // Parse lines
   std::getline(StrLine,bookNumber,',');
   std::getline(StrLine,chk,',');
   std::getline(StrLine,author,',');
   std::getline(StrLine,title,',');            
   std::getline(StrLine,edition,',');
}

2 个答案:

答案 0 :(得分:6)

做好这件事有点复杂。基本上,你读第一个字符。如果它不是引用,那么你读到下一个逗号。如果是报价,请阅读下一个报价。然后你偷看 next 字符,看看它是否是另一个引用。如果是,则读取下一个引用再次,并将您读到的内容添加到您第一次阅读的内容的末尾,但没有引号(即引用字符串中的引号)由两个连续的引号代表)。当你得到一个引号后跟一个引号以外的东西(通常应该是一个逗号)时,你就到达了该字段的末尾。

答案 1 :(得分:2)

没有测试过,但大概是你想要的......

std::vector<string> values;
std::string value;
bool in_quoted = false;

for (const char* p = ImpLine.c_str(); *p; ++p)
    if (*p == ',' && !in_quoted)
    {
        values.push_back(value);
        value.clear();
    }
    else if (*p == '"')
        if (in_quoted)
            if (p[1] == '"')
                value += *++p;
            else
                in_quoted = false;
        else
            in_quoted = true;
    else
        value += *p;

values.push_back(value);

(您可能需要调整它来修剪周围空白的字段。)