在使用MFC读取csv文件的每一行并按逗号分隔时遇到这样的问题:
csv文件是用逗号作为列分隔符的,我读到csv文件的一行后,也是按照逗号来进行分割的,以便能够把这一行字符串按照原本csv文件中列的形式分割出来。但是当某个单元格的数据本身就带有逗号时(比如有一个单元格是“中国,朝鲜”),而且该逗号也是英文半角的,这个时候我的分隔便出错了,因为这个逗号的存在,原本csv中占10列的一行现在被分割成了11个,该如何解决?
CSV格式规范
根据csv的格式规范来看,包含逗号的一列数据应该是被双引号包起来的,这样就好办了,只要把被双引号包含的字符串提取出来然后把里面的逗号替换成别的符号,然后再拼接上原字符串中被双引号包起的字符串左边和右边的部分就好了。这里也只保证适用于格式规范的csv文件,不规范的文件不保证成功。
void _analyse_line(CStringW line) {
// 保存原字符串副本
CStringW copy_line = line;
// 获取首个双引号在字符串中的索引
int fquote_index = line.Find('\"');
// 如果不存在双引号,可以直接按照逗号分割该字符串
// 存在双引号的话检查被双引号包起的字符串中是否存在逗号
if (fquote_index != -1) {
int lquote_index = 0, _index;
// 获取最后一个双引号的索引
while ((_index = line.Find('\"')) != -1) {
line = CStringW(line.Right(line.GetLength() - _index - 1));
lquote_index += _index + 1;
}
// 双引号包起的字符串的长度
int len = lquote_index - fquote_index;
// 首个双引号左边的字符串
CStringW left = copy_line.Left(fquote_index);
line = CStringW(copy_line.Right(copy_line.GetLength() - fquote_index));
// 最后一个双引号右边的字符串
CStringW right = CStringW(line.Right(line.GetLength() - len));
// 被双引号包起的字符串
line = CStringW(line.Left(len));
// 替换被双引号包起的字符串中的逗号
line.Replace('\,', '\t');
// 拼接新的字符串
line = left + line + right;
}
vector arr = split(line, ',');
// 把用'\t'替换过的逗号还原回来
for (int i = 0; i
split方法不贴了,实现方法很多。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。