如何转义CSV文件中的逗号

CSV全称是:Comma Separated Values 或者 Character Separated Values。

尽管第一种说法更常见,但我觉得还是第二种说法更确切一些,因为你可以使用其它字符做分隔符。

使用逗号做分隔符的CSV文件有一个好处:你可以直接用Excel打开。如果使用其它分隔符,比如“|”,你必须告诉Excel该文件使用“|”作分隔符,Excel才能把它导入进来。 

前几天,project manager告诉我:我们有许多CSV文件,都是使用“|”做分隔符,用Excel打开的时候比较麻烦,用户想在Excel中直接打开。这样就需要使用“,”做分隔符。但是文件中有些字段含有逗号,必须对这些逗号特殊处理,才能保证CSV文件在Excel中正确打开。他还给了我一个算法:

如果字段中有逗号(,),该字段使用双引号(")括起来;

如果该字段中有双引号,该双引号前要再加一个双引号,然后把该字段使用双引号括起来。

看完project manager的要求,我真是满头起包啊。在IT业混了十几年了,竟然不知道这样处理逗号。

举几个例子:

 

字段处理前

字段处理后

abc,d2

"abc,d2"

ab"c,d2

"ab""c,d2"

"abc

"""abc"

""

""""""

 

如果字段中有两个挨着的双引号,比如:aaa""ccc。这种情况不用特殊处理。这是我在写这篇博客的时候才想起来的,赶忙使用Excel测试了一下。还好,不用特殊处理就能正常打开,不然我还得改程序。当然了,如果你把它处理成:"aaa""""ccc" Excel也能正常打开。事后总结总结真是有好处啊。

另外,如果某字段第一个字符是空格,第二个字符是双引号,这种情况不用特殊处理。Project Manager在给我描述算法的时候,也举了一个字段只有一个双引号的例子,但他不小心在双引号前面加了个空格,把问题掩盖过去了。

我是在WinXP和MS Excel2007下测试的。如果运行在其他环境和应用程序下,还需进行测试,规则可能不一样。

 

(这是一篇老博文,11-1-22 下午11:44 发布在Google Blogger上。但我只是几年前在那里发了几篇文章,早已经不维护了,干脆把看得上眼的文章搬过来算了)

转载于:https://www.cnblogs.com/exmyth/p/11549571.html

在MFC中,读取CSV文件并按逗号进行分割通常会涉及使用流(fstream)和字符串流(stringstream),因为MFC本身不直接支持CSV解析。下面是一个简单的步骤说明: 1. **打开文件**: 使用`CFile`类打开CSV文件,确保正确指定文件路径和模式(如"rb"代表二进制读取)。 ```cpp CFile file("your_file.csv", CFile::modeRead); if (!file.IsOpen()) { // 文件无法打开,处理错误 } ``` 2. **读取数据**: 创建一个字符串流,然后逐行读取文件内容到其中。 ```cpp std::string line; while (!file.ReadString(line)) { if (file_eof(file)) break; // 文件结束 } ``` 3. **分割每一行**: 使用`std::getline`将每行拆分为单独的字段,并用`std::stringstream`按逗号分割每个字段。 ```cpp std::stringstream ss(line); std::vector<std::string> fields; std::string field; while (std::getline(ss, field, ',')) { fields.push_back(field); } ``` 4. **处理结果**: 现在`fields`向量里存储了按逗号分割的字段,你可以进一步处理这些数据。 ```cpp for (const auto& field : fields) { // 这里可以做你想做的事情,比如打印、存储到其他结构等 } ``` 5. **关闭文件**: 当完成所有处理后,别忘了关闭文件。 ```cpp file.Close(); ``` 注意,这个例子假设CSV文件没有特殊字符,如果包含引号或其他转义字符,可能需要更复杂的解析策略,甚至考虑使用专门的CSV解析库,如`picojson`或`csv-parser`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值