CString比较时要注意的

最近上班的时候接到一个需求:

1、用户给定了一个列表,里面是一些中英文混杂的字符串,标点符号也是混的:

比如:

序号          名称

  1      1号和a去图书馆——有英文数字、中文、英文小写

  2      和同学b聚会定在22日——有全角数字、中文、英文小写

  3     C的书名是“数学”——有中文标点符号、中文、英文大写

  4      "Jack"是他的名字——有英文标点符号、中文、英文

同时又给出一组极大的数据,要求从这些数据里找出,和上面的列表匹配的数据并生成报表,另外把数据中没有的列表项也生成一个报表。

数据:     序号                                名称

         10000456                      1号和A去图书馆

         21111175                      和同学b聚会定在22日

         21111177                      “Jack”是他的名字

要求匹配时忽略全半角和大小写。

也就是说匹配的报表应该是:

序号                名称                            在数据中的序号

1              1号和A去图书馆                   10000456

2              和同学b聚会定在22日            21111175 

3              “Jack”是他的名字                  21111177

 

另外一个报表应该是:

序号                名称  

1              C的书名是“数学” 

 

实际的数据非常大,无论比较的条件是什么,都必须把数据一条一条读出来,再和列表中的数据一条一条进行比较,那么这就是一个双重循环,对于大数据的处理,这无疑是个灾难,所以,我首先做的是在读取列表时,构造索引,读取列表中每一个名称时,将字符串的前2个字符作为索引,存放在map中,这样在比较时就可以大大缩减查询的时间。

 

另外是客户的忽略全半角和大小写的要求。

我们公司用的是C++,所以对字符串的处理都使用CString,MSDN里提供了这样一个函数LCMapString,它可以轻松的实现半角转全角、全角转半角,而CString本身有CompareNoCase函数,可以忽略大小写来进行比较。

这里在实际处理时有这样一个问题,如果在读取列表中的数据时,将列表中的数据直接半角转全角然后存储,在比较时,将数据也做半角转全角,那么在比较时,对中文符号中的引号就没法比较了,因为英文的"半角转全角后是",而中文的引号是分上引号和下引号的,所以比较好的方法是将所有的数据全角转半角后再比较。

 

int ConvertHornsToHalfHorn(const CString & strInValue, CString & strOutValue)
{
 int nLength = strInValue.GetLength();
 const int sizeKeyWord = nLength;
 char * szKeyWord = new char[sizeKeyWord];
 ::ZeroMemory( szKeyWord, sizeKeyWord );
 LCMapString( GetUserDefaultLCID(),
  LCMAP_HALFWIDTH,
  (LPCTSTR)strInValue,
  nLength + 1,
  szKeyWord,
  sizeKeyWord);
 strOutValue.Format("%s", szKeyWord);
 delete [] szKeyWord; // char * szKeyWord = new char[sizeKeyWord]
 szKeyWord = NULL;
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值