我基本上运行以下代码。此代码逐行执行并获取通用逗号分隔表文件的不同字段。我的问题是,有时“标题”字段可以包含逗号。当它这样时,它被引号括起来:“这,这是我的头衔”。 但是当我的代码看到逗号时,它只会将其后的所有内容视为下一个字段。并非所有标题都有引号,只有引号括起来。我的问题是,我不知道如何使代码检查这....我怎样才能让我的代码检查这个问题?
非常感谢,你好。这对我的有酬工作意义重大!
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,',');
}
答案 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);
(您可能需要调整它来修剪周围空白的字段。)