VC 一部分列含有双引号的CSV数据分割

本文介绍了一种处理CSV文件中带有双引号单元格的方法,并提供了一个具体的C++函数实现。该函数能够正确处理被双引号包围的数据字段,确保数据的准确读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实这个我一直在想最好还是用正则表达式实现,但发现效率有些不理想,而且这种情况下流程也复杂了

CSV每行记录中有时会有一个单元段数据中出现双引号的情况,

针对这种情况写一个函数,代码如下:

void GetCsvRecordColumnsData(CString record, CList<CString,CString&> & retList)

{

CList<CString,CString&> list;

retList.RemoveAll();

CString str =record;

int len = str.GetLength();

int iPos = str.Find(","), iStart = 0, offset = 0, findStartIndex = 0;

while (iPos != -1)

{

list.AddTail(str.Mid(iStart, iPos - iStart));

iStart = iPos + 1;

iPos = str.Find(",", iStart);

}

if (iStart <= len)

list.AddTail(str.Mid(iStart));

POSITION pos = list.GetHeadPosition();

CString preWords, curWord;

 

offset = 0;

while(pos != NULL){

curWord = (CString)list.GetNext(pos);

offset = 0;

if (curWord.Mid(0,1) == "/"" && curWord.Mid(curWord.GetLength()-1) != "/""){

preWords = curWord;

bool finded = false;

while( pos!=NULL ){

curWord = (CString)list.GetNext(pos);

++ offset;

if (curWord.Mid(0,1) != "/"" && curWord.Mid(curWord.GetLength()-1 ) == "/""){

curWord.Insert(0,",");

curWord.Insert(0,preWords);

retList.AddTail(curWord);

finded = true;

break;

}

else if (curWord.Mid(0,1) == "/"" && curWord.Mid(curWord.GetLength()-1) == "/""){

break;

}else if (curWord.Mid(0,1) == "/""){

break;

}else{

curWord.Insert(0,",");

curWord.Insert(0,preWords);

preWords = curWord;

}

}

if (! finded){

pos = list.FindIndex(findStartIndex);

if (pos!=NULL){

curWord = (CString)list.GetNext(pos);

retList.AddTail(curWord);

++findStartIndex;

}

}else{

findStartIndex += offset;

}

}else{

retList.AddTail(curWord);

++findStartIndex;

}

}

}

=================================

有其他方法的朋友分享出来吧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值