目的是每读一行,分割数据处理显示,现在实现的是先预读所有行,然后存下来,最后用定时器将存的一行处理显示。
但是这样做太占内存,而且文件太大的时候肯定会卡。所以现在想先读100行存完处理,再读取之后的,以此一直下去,如果下面不足100行,则一次性读完存储处理。不知道各位有什么好的方法没,谢谢!!C#文件读取

解决方案 »

  1.   

    http://msdn.microsoft.com/zh-cn/library/system.io.streamreader(v=VS.80).aspxStreamReader.ReadLine()方法进行简单的处理下就可以了。
      

  2.   


     string path= Server.MapPath(filePath);
                    System.IO.StreamReader file = new System.IO.StreamReader(path, Encoding.Default);               
                    string line;
                    while ((line = file.ReadLine()) != null)
                    {
                        //是否读第一行
                        if (isReadOne.Value) continue;                    DataRow dr = dtSuccess.NewRow();
                        //读txt数据
                        string[] fields = null;
                        if (fileType == "csv") fields = line.Split(new char[] { ',' });
                        else if (fileType == "txt") fields = line.Split(new char[] { '\t' });                    if (fields.Count() != dtDatas.Count()) continue;                    for (int i = 0; i < fields.Length; i++)
                        {
                            string sColunId = dtDatas[i].ToString();
                            dr[sColunId] = fields[i];
                        }
                        dtSuccess.Rows.Add(dr);
      

  3.   

    你的假设是要海量数据的处理。
    可以使用流水线的概念啊。
    并不需要很多的线程,3个足以:读文件线程,处理数据线程,显示数据线程
    建立两个缓存队列,一个存储读文件读出来的数据,一个存储处理完毕需要显示的数据这样的话,可以解决你想的海量数据全部放内存的问题,又可以不需要定量100个具体做法这样来:
    读文件的线程只是读文件,读完了文件,放到队列A
    队列A自己继承集合类写一个,主要是为了增加一个回调的event,当有新的数据进来的时候,就触发一个event。
    队列A的event里面调用处理数据线程的信号灯,让处理数据线程去队列A取数据,处理。
    处理完毕,把结果丢给队列B,队列B同样有个event被触发。
    队列B的event调用显示数据线程的信号灯,显示线程显示数据。写的有点麻烦,但是静下心来看看,你会看明白的
      

  4.   

    一次性读出,存在list<string>里,每行一个string
      

  5.   

    StreamReader流模式,一点都不会卡
      

  6.   

    百兆不算太大 看看 System.IO.MemoryMappedFiles
      

  7.   

    FileStream 用这个吧,自己计算读取的偏移量
    这个读取几十G都没问题。
      

  8.   

    用StreamReader ReadeLine有个缺点,就是每次都要从头开始 还是直接FileStream的Read()他有offset
      

  9.   


    读行要自己去处理,反回继续上次的位置,要自己保存上次读到什么位置。反正没有那么简单就搞定的。自己写个FileReader类来处理吧。
      

  10.   

    我认为在数据行小于100W以下的情况下。直接全部读入后再处理。速度要比一行一行读来得快得多。楼主可以试一下。现在内存大得去了。文本数据能有多大。30MB-80MB不得了了。不就是这么多内存嘛
      

  11.   

    看了一些回复
    感觉
    多线程,offset,比较靠谱
    我在给个意见吧 序列化再反序列化
      

  12.   


    是的,既然是海量数据,那么就不要想着一次读完,offset也可以,只不过offset需要长时间占用那个文件,我个人不推荐。
      

  13.   

    边读边处理绝对是最好的方法,就用read读取,然后处理,在根据offset偏移量计算下次读取的位置。