我想实现的功能是:将不同文本文件中相同的一些特性的数据合并,并生成一个新的文本文件.
文本文件的格式如下:
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);
}
文本文件的格式如下:
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);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货