从char*以CSV的格式读入到vector容器里

本文介绍了一种将CSV格式的字符串解析并存储到C++标准库中的vector容器的方法。通过遍历输入字符串,并根据CSV的特性(如逗号分隔和双引号包围的数据字段)进行解析,最终将每条记录作为char*类型存储到vector中。

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

从char*以CSV的格式读入到vector容器里。
vector<char*>   vecShr;
void getstrforcsv(char* input_buff		
{		
	for(int k = 0 ; k  < vecShr.size() ; k++ )	
	{	
		char* p_string = vecShr.at(k);
		delete[] p_string;
	}	
	vecShr.clear() ;	
	bool bFlagQuote = false;	
	unsigned int unLinePos = 0;	
	unsigned int unLenth = 0;	
	unsigned int i = 0;	
	unsigned int j = 0;	
	char* p_string = NULL;	
	char* p_tmp_string = NULL;	
	bool bFlagFirstPair = false;	
	bool bFlagBreak = false;	
	int nStrLen;	
	unLenth = strlen(input_buff);	
	if(unLenth > 1024)	
	{	
		unLenth = 1024;
	}	


	p_tmp_string = new char[unLenth + 1];	
	if(NULL == p_tmp_string)	
	{	
		return;
	}	

	for(j = 0; j < unLenth; j++)	
	{	
		unLinePos = 0;
		bFlagFirstPair = false;
		bFlagQuote = false;
		memset(p_tmp_string, 0, unLenth + 1);
		for(i = 0; i< unLenth; i++)
		{			
			bFlagBreak = false;		
			// 判断Data是否被Double Quote包围		
			if((0 == unLinePos) && (input_buff[j] == '"'))		
			{		
					bFlagFirstPair = true;
					bFlagQuote = true;
					p_tmp_string[i++] = input_buff[j++];
			}		
			if(bFlagQuote)		
			{		
				//Double Quote包围
				int nQuoueNum = 0;	
				switch (input_buff[j])	
				{	
				case '\0':	
					bFlagBreak = true;	
					break;	
				case ',':		
					if(bFlagFirstPair)	
					{	
						p_tmp_string[i] = input_buff[j++];
					}else	
					{	
						bFlagBreak = true;
					}	
					break;	
				case 0x0A:		
				case 0x0D:		
					if(bFlagFirstPair)	
					{	
						p_tmp_string[i] = input_buff[j++];
					}else		
					{		
						if((input_buff[j+1] == 0x0A) || (input_buff[j+1] ==0x0D))	
						{	
							j++;
						}	
						bFlagBreak = true;	
					}		
					break;		
				case '"':			
					nQuoueNum = 1;		
					p_tmp_string[i] = input_buff[j];		
					while(input_buff[++j] == '"')		
					{		
						nQuoueNum++;	
						//if((nQuoueNum>3) && ((nQuoueNum - 3) & 0x01))	//<--										//{//<--多个双引号2个变1个	
							p_tmp_string[++i] = input_buff[j];
						//}//<--	
					}		
					if(nQuoueNum & 0x01)//nQuoueNum%2		
					{		
						bFlagFirstPair = false;	
					}		
					break;		
				default:			
					p_tmp_string[i] = input_buff[j++];		
				}			
			}else				
			{				
				//Double Quote没包围			
				switch (input_buff[j])			
				{		
				case ',': 		
				case '\0':		
					bFlagBreak = true;	
					break;	
				case 0x0A:		
				case 0x0D:		
					if((input_buff[j+1] == 0x0A) || (input_buff[j+1] ==0x0D))	
					{	
						j++;
					}	
					bFlagBreak = true;	
					break;	
				default:		
					p_tmp_string[i] = input_buff[j++];	
				}		
			}	
			if(bFlagBreak)	
			{	
				break;
			}	
			unLinePos++;	
		}		

		//		
		p_tmp_string[i] = '\0';		
		nStrLen = strlen(p_tmp_string) + 1;		
		if(nStrLen > 1)		
		{		
			p_string = new char[nStrLen];	
			if(NULL == p_string)	
			{	
				delete[] p_tmp_string;
				return;
			}else	
			{	
				strcpy_s(p_string, nStrLen, p_tmp_string);
				vecShr.push_back(p_string);
			}	
		}		
	}			
	delete [] p_tmp_string ;			
	return;			
}				

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值