getline用于逗号分隔的表文件,在某些字段周围加引号
std::getline for a comma delimited table file with quotations around certain fields
我基本上运行以下代码。这段代码逐行执行并获取通用逗号分隔表文件的不同字段。我的问题是,有时"标题"字段可以有逗号在它。当它出现时,它会被引号括起来,像这样:"this, this is my title"。但是当我的代码看到逗号时,它只是把它之后的所有内容当作下一个字段。并不是所有的标题都有引号,只有带逗号的标题才有。我的问题是,我不知道如何使代码检查这个....如何让我的代码检查此问题?
非常感谢,各位。这对我的高薪工作意义重大!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,',');
}
做好这一点有点复杂。基本上,你要读第一个字。如果不是引号,就读到下一个逗号。如果这是一句引语,你就读到下一句。然后偷看下一个字符,看看它是否是另一个引号。如果是,您将再次读取到下一个引号,并将您所读取的内容添加到您第一次读取的内容的末尾,但不使用引号(即,引号字符串中的引号由两个连续引号表示)。当你看到引号后面有引号以外的东西(通常应该是逗号)时,你就到达了该字段的末尾。
还没有测试过,但是你大概想要…
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);
(您可能希望调整它以修剪周围空白的字段)
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- Boost Tokenizer无法解析具有带有双引号的字段的CSV文件
- 两个 4 位位字段加起来不等于一个字节的大小 - 如何修复?
- Lua:加载第二个字符串后无法获取字段;
- getline用于逗号分隔的表文件,在某些字段周围加引号