标题:C#利用缓存读取TXT文件
只看楼主
qq378508145
Rank: 2
等 级:论坛游民
帖 子:11
专家分:15
注 册:2012-7-19
结帖率:0
已结贴  问题点数:5 回复次数:10 
C#利用缓存读取TXT文件
下面是TXT文件内容,有几十万行
237.6878287    47.44984698    340    62.9296875    0    -2.109375    0
237.6878287    47.44984698    340    62.9296875    0    -2.109375    0
237.6878287    47.44984698    340    62.9296875    0    -2.109375    0
237.6941802    47.44538379    340    62.9296875    0    -2.109375    0
237.6941802    47.44538379    340    62.9296875    0    -2.109375    0
237.6941802    47.44538379    340    62.9296875    0    -2.109375    0
现在我不想直接全部读进内存里面,所以想到文件缓存流实现
需要读取的当前行和当前的下一行,能分辨出所有是double类型   分隔符是“\t”

主要,需要把每一行所有的double类型提取出来
有经验者望指点一二
搜索更多相关主题的帖子: 340 内存 
2012-08-02 14:45
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:2 
//原文件oldFile,请修改路径
string oldFile = "C:\\1.txt";
//double型数据将写入新文件newFile,仍以\t分割,请修改路径
string newFile = "C:\\2.txt";
string outStr = "";
int a;
double b;
FileStream fs = new FileStream(oldFile, FileMode.Open);
FileStream fs1 = new FileStream(newFile, FileMode.Create);
StreamReader sr = new StreamReader(fs);
StreamWriter sw = new StreamWriter(fs1);
while (!sr.EndOfStream)
{
    outStr = "";
    string str = sr.ReadLine();
    string[] arrStr = Regex.Split(str, "\t");
    for (int i = 0; i < arrStr.Length; i++)
    {
        if (int.TryParse(arrStr[i], out a))
        {
        }
        else if (double.TryParse(arrStr[i], out b))
        {
            outStr += arrStr[i] + "\t";
        }
    }
    if (arrStr.Length > 1)
    {
        outStr = outStr.Substring(0, outStr.Length - 1);
        sw.WriteLine(outStr);
    }
}
sr.Close();
sw.Close();
fs.Close();
fs1.Close();
2012-08-02 15:40
qq378508145
Rank: 2
等 级:论坛游民
帖 子:11
专家分:15
注 册:2012-7-19
得分:0 
回复 2楼 yhlvht
那我如何判断这个文件里面有多少行呢?
2012-08-02 15:56
qq378508145
Rank: 2
等 级:论坛游民
帖 子:11
专家分:15
注 册:2012-7-19
得分:0 
回复 2楼 yhlvht
我说清楚一点,就是我在任何情况下就想得到文件的总行数,可能是文件刚刚打开缓存
关键是不能一次打开文件到内存
2012-08-02 16:04
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
不管用什么方式,数据在电脑中就两地方可以放,内存和硬盘。想要知道文件总行数到不难,从头读一次,用int变量加加加呗,这样你在任何情况下都可以使用这个变量得到总行数。
既然内存一次放不下,那只能借一下硬盘用咯。

如果只是几十万数据,内存肯定放得下的,取总行数就更简单

[ 本帖最后由 yhlvht 于 2012-8-2 16:31 编辑 ]
2012-08-02 16:25
qq378508145
Rank: 2
等 级:论坛游民
帖 子:11
专家分:15
注 册:2012-7-19
得分:0 
回复 5楼 yhlvht
其实我是想不加进内存获取行数,我也想过这样用++来走一遍,但是其实很耗费时间,估计计算行数比直接加进内存来算数组长度还有更耗时间。而且还需要遍历2遍,一次快速得到长度,一直慢慢的读取数据
2012-08-02 16:33
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
那你用int aa = File.ReadAllLines(FilePath).Length;来取行数吧,我测了80几M的文件,160多万行,也不过1秒钟而已。

不读一遍文件始终没有办法

[ 本帖最后由 yhlvht 于 2012-8-2 17:16 编辑 ]
2012-08-02 17:13
qq378508145
Rank: 2
等 级:论坛游民
帖 子:11
专家分:15
注 册:2012-7-19
得分:0 
回复 7楼 yhlvht
我第一次是用这种方式的,不过这种方式有一个缺点,就是文件会一次性读进内存
2012-08-03 09:47
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
回复 8楼 qq378508145
读进内存以后,你把它回收掉就好了。
2012-08-03 10:03
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
得分:2 
楼上的一直在说服楼主。

试试文件的大小除以每行的字节数。如果每行的数据量是固定的话。
2012-08-08 12:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-374602-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.081386 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved