Boost tokenizer 无法解析具有双引号字段的 csv 文件
Posted
技术标签:
【中文标题】Boost tokenizer 无法解析具有双引号字段的 csv 文件【英文标题】:Boost tokenizer fails to parse csv file having field with double quote 【发布时间】:2018-02-26 19:17:55 【问题描述】:我正在解析具有两列的.csv 文件。我正在尝试使用 csv 文件中的 boost tokenizer 解析行,其中行中的一个字段是双引号(例如:1,“test”)。在标记器之后,我在 tok (1,test) 中得到没有双引号的字段。
typedef tokenizer< escaped_list_separator<char>> Tokenizer;
if (getline(inputFile, line))
Tokenizer tok(line);
vector< string > vec;
vec.assign(tok.begin(), tok.end());
//Here *(vec.begin() + 1) is printing string- test , without double quote
有没有办法用双引号获得第二个字段?
【问题讨论】:
确实,双引号被分词器“吃掉”了。但如果不是,您必须自己删除它们。或者,如果您真的很喜欢它们,为什么不自己添加引号呢?所以,请详细说明:为什么引号的存在对您很重要。这有助于我们想出鼓舞人心的想法。 我从带有双引号的用户那里获取数据以写入 CSV。所以我需要在向用户展示这些数据时保持不变。我将拥有大量数据,因此我如何自己添加引号将很困难,因为我可能需要记住带有引号的字段。所以我正在寻找即使在标记器之后也可以用双引号维护字段的方法。 【参考方案1】:引号是一个演示的东西。解析/标记数据后,您希望返回 未转义 数据。
引用/转义表示仅用于保护传输中数据中的特殊字符(以防止它们干扰您的协议¹)。
一旦您读回它,它就不再在传输中,并且“保留”转义或引号(或您的协议附带的任何其他人工制品¹)将是一个错误,事实上是错误的常见来源,而不是很少的安全漏洞
样品
CSVa
或 "a"
对应的值为 a
同样"\""
对应"
"\\\""
对应于\"
"\"
不完整(引用的构造未关闭)
重要的是您的价值观在不丢失信息的情况下往返。因此,将 "a"
解析为值 "a"
会产生概念错误,将其转换回引号转义格式会突然看起来像 "\"a\""
,这是完全不同的事情!
¹ 表示格式或传输协议
² 最常见的是,code injection:
当应用程序向解释器发送不受信任的数据时,就会出现代码注入漏洞(注入缺陷)。注入缺陷最常出现在 SQL、LDAP、XPath 或 NoSQL 查询中;操作系统命令; XML 解析器、SMTP 标头、程序参数等。注入缺陷在检查源代码时往往比通过测试更容易发现。[1]扫描仪和模糊器可以帮助发现注入漏洞。[2]
【讨论】:
我知道 boost 分词器会在分词后给 a "a" 但我正在寻找即使在分词器之后也能得到这个双引号的方法。我需要展示我在写入 CSV 时接受的数据。 您需要提供数据。不是 CSV 编码。如果您也想要显示源编码形式(即不是数据),那么您需要使用其他东西进行解析。例如。 coliru.stacked-crooked.com/a/dc5f0f1cfd91c456 相关证据见此处that injection is a real problem。安全!以上是关于Boost tokenizer 无法解析具有双引号字段的 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何定义 boost tokenizer 以返回 boost::iterator_range<const char*>
解决json string转object,value值存在英语双引号,无法解析问题。以及遇到value值中有双引号,如何解析成功。
解决json string转object,value值存在英语双引号,无法解析问题。以及遇到value值中有双引号,如何解析成功。