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

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

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;

}

}

}

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于VC的ListControl控件,您可以通过设置自定义绘制来在某一中显示图标。下面是一个简单的示例代码,演示如何在ListControl的第一中显示图标: 首先,您需要在ListControl的初始化代码中启用LVS_OWNERDRAWFIXED样式,以便自定义绘制: ```cpp // 创建ListControl控件 CListCtrl m_listCtrl; m_listCtrl.Create(WS_VISIBLE | WS_CHILD | LVS_OWNERDRAWFIXED, CRect(10, 10, 200, 200), this, 1); ``` 然后,您需要处理WM_DRAWITEM消息来执行自定义绘制。在您的窗口类的消息映射函数中添加以下代码: ```cpp BEGIN_MESSAGE_MAP(YourWindowClass, CWnd) // 其他消息映射... ON_WM_DRAWITEM() END_MESSAGE_MAP() // 处理WM_DRAWITEM消息 void YourWindowClass::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { if (lpDrawItemStruct->CtlType == ODT_LISTVIEW) { CDC dc; dc.Attach(lpDrawItemStruct->hDC); CRect rect(lpDrawItemStruct->rcItem); int nItem = lpDrawItemStruct->itemID; int nSubItem = 0; // 第一的子项索引为0 // 绘制图标 if (nSubItem == 0 && (lpDrawItemStruct->itemAction & ODA_DRAWENTIRE)) { // 获取图标 HICON hIcon = // 获取图标的方式,例如从资源加载、系统图标等 // 绘制图标 dc.DrawIcon(rect.left, rect.top, hIcon); // 调整绘制区域 rect.left += GetSystemMetrics(SM_CXICON); } // 绘制文本 CString strText = m_listCtrl.GetItemText(nItem, nSubItem); dc.DrawText(strText, rect, DT_SINGLELINE | DT_VCENTER); dc.Detach(); } } ``` 这样,ListControl的第一中就会显示您指定的图标了。请注意,以上代码仅为示例,您需要根据实际情况进行修改和完善。 希望能对您有所帮助!如果您还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值