我想实现的功能是:将不同文本文件中相同的一些特性的数据合并,并生成一个新的文本文件.
文本文件的格式如下:
Num1+空格+Num2+空格+数据1+空格+数据2+空格+数据3
(每行的数据都是这个格式,将不同文件中Num1和Num2都相同的行的数据1,数据2,数据3都求和相加得到新的文件)
我先是读取第一个文本文件,每行的数据读出后都放到一个结构体中,如下"zTCodeCombin"定义的.然后将按照结构体中不同的sKey(也就是Num1)放置到哈希表中,因为我定义了Num1不超过6位,所以哈希就定义了如下大小.哈希的每个元素是一个队列,放置相同的Num1,但是不同的Num2的结构体.不过内存的消耗非常巨大,因为文件的大小在200多兆.大家看看有什么精简的方式合并,谢谢!htDaySta = new Hashtable(1000000);//定义哈希表大小
//定义结构体
public struct zTCodeCombin
{
public string sKey,sPreNumber;
public int iInfo1,iInfo2,iInfo3;
public zTCodeCombin(string skey,string snumber,int iinfo1,int iinfo2,int iinfo3)
{
sKey = skey;//号码末六位
sPreNumber = snumber;//除去末六位的号码
iInfo1 = iinfo1;//数据1
iInfo2 =iinfo2;//数据2
iInfo3 =iinfo3;//数据3
}
}//说明:以下代码是读取文本文件中每行后的操作
if(htDaySta.Contains(zInfo.sKey))//zInfo为zTCodeCombin的结构体,读出的文本中的每一行数据放在一个结构体中
{
   ArrayList aTemp = (ArrayList) htDaySta[zInfo.sKey];
   for(int j = 0; j < aTemp.Count; j++)
   {
zTCodeCombin zStruct = (zTCodeCombin)(aTemp[j]);
if(zStruct.sPreNumber == zInfo.sPreNumber)//判断除去后六位的前面的号码是否一致
{

zStruct.iInfo1 = zInfo.iInfo1 + zStruct.iInfo1;//数据1
zStruct.iInfo2 = zInfo.iInfo2 + zStruct.iInfo2;//数据2
zStruct.iInfo3 = zInfo.iInfo3 + zStruct.iInfo3;//数据3
                  aTemp.Remove(aTemp[j]);
        aTemp.Add(zStruct);
        htDaySta.Remove(zInfo.sKey);
        htDaySta.Add(zInfo.sKey,aTemp);
       break;
        }
//如果循环到最好没找到结构体中sPreNumber 相同的一项,就将其加入到队列中,再加入到哈希表中
if(j == aTemp.Count - 1)
{
aTemp.Add(zInfo);
htDaySta.Remove(zInfo.sKey);
htDaySta.Add(zInfo.sKey,aTemp);
break;
}
    }
}else
{
ArrayList aTemp = new ArrayList();
aTemp.Add(zInfo);
htDaySta.Add(zInfo.sKey,aTemp);
}

解决方案 »

  1.   

    按照楼主所述思路,总是要把文件中的记录读到内存中,不管具体的数据结构和算法怎么设计,都无法避免,这样没法有效减少内存使用。如果先把文件中的记录读到数据库如何,设计一个表,合并的功能很容易实现了,也能避免先将数据全部Load然后再处理的过程。
      

  2.   

    同scow……文本文件本身就是200多m,既然要读取里面的数据肯定要把文件读到内存里,这样至少这200m的内存肯定就省不下来了吧……用数据库的话,如果设计的好,应该可以直接用查询语句就能算出结果了吧……