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;
}

你可能感兴趣的:(CString比较时要注意的)