读取.csv文件到底使用哪种方式效率更高?

通过测试对比发现,还是网上的很多网友的推荐使用readLine()方法效率更高。


测试环境:windows mobile 6.3 平台,text.csv文件有3.8M大小,23列数据,有2.1W条记录



1、以下是使用bytes[]数组对文件进行读取的方式

<textarea name="code" class="c#">  

string path="text.csv";
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);       //打开出货单头档
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, (int)fileStream.Length);
int Len = 0;
long totalLen = 0;
while (bytes[totalLen + Len] != '\n')
{
       Len++;
}
totalLen += Len + 1;                                 //去csv文件的掉标题栏
while (totalLen < fileStream.Length)        //文件未结束,一直读取
{
    Len = 0;
    //i = 0;
    while (bytes[totalLen + Len] != '\n')        //每次读取一行,记录一行的长度为Len
    {
          Len++;
    }
   Encoding.Default.GetString(bytes, (int)totalLen, Len - 1);    //将读取到的一行数据转换为string类型
   totalLen += Len + 1;
}

</textarea> 


2、以下是使用StreamReader类的readLine()方法进行一行一行地读取

<textarea name="code" class="c#">  

string path="text.csv";

string line;

StreamReader file=null;
      FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
      if (fileStream != null)
      {
          fileStream.Seek(0, SeekOrigin.Begin);
          file = new StreamReader(fileStream, Encoding.Default);
     }

while((line = file.ReadLine()) != null)

{

     string[] arr = line.Split(',');            //后来经过测试发现,使用这种数组的方式是一个极其错误的方式,因为它耗时是最多的一个,可能系统的构造和析构耗费了大量的时间

}

</textarea>  

不幸的是这位:http://blog.csdn.net/leehao_vip/article/details/7851567  同仁也是使用这种方式进行读取700W条数据

已标记关键词 清除标记
相关推荐
# 怎么让这个程序处理数据快一点 //MAC地址处理代码 CStdioFile file; int i; CString str1,strd; file.Open("F:\\h1.txt",CFile::modeRead); //h1.txt是串口接收到的MAC地址数据包文件 for(i=0;file.ReadString(str1);i++) { str1.MakeUpper(); //h1.txt中字母大写 //开始标志 if(str1.Find('*')>=0) //该行str1中有字符“*”? { CTime ct=CTime::GetCurrentTime(); //获取系统当前时间 CString time=ct.Format("%Y.%m.%d.%H:%M:%S."); //CTime转换成CString strd += time + "\t数据包开始,包含" + str1.Mid(2,str1.Find('%')-2) + "个MAC地址:"; //EDIT显示 strd += "\r\n"; } //结束标志 else if(str1.Find('@')>=0) //该行str1中有字符‘@’? { strd += "数据包结束!!!"; strd += "\r\n"; } //处理MAC地址 else { CStdioFile read; CString str11; int j; BOOL bResult = FALSE; //BOOL用来结束循环 read.Open("F:\\z2.txt",CFile::modeRead); //z2.txt是标志MAC地址与厂商库文件 for(j=0;read.ReadString(str11);j++) { CString buf1[5000],buf2[5000],buf3[5000]; buf1[i]=str1.Mid(0,6); //读取str1中每行0-6位之前的内容到buf1, str1.Mid(0,str1.Find('\r')-3) buf2[j]=str11.Left(str11.Find(' ')); //读取str11中每行空格符之前的内容到buf2 buf3[j]=str11.Mid(str11.Find('\t')+2).Trim(); //读取str11中(‘\t’+2)之后部分到buf3 //判断 buf1 与 buf2 关系 if(buf2[j] == buf1[i]) { strd += "MAC地址:"+str1.Mid(0,12)+"\t厂商:"+buf3[j]; strd += "\r\n"; bResult = TRUE; //bResult置1 break; //结束, } }//该for循环结束,开始读取str1下一行 // if (!bResult) // { strd+="MAC地址:"+str1.Mid(0,12)+"\t厂商:NULL"; strd+="\r\n"; } } } SetDlgItemText(IDC_EDIT2,strd);
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页