2 mj1158880481 mj1158880481 于 2014.12.05 14:47 提问

如何将多个txt文本合并在一个文本里面并且完全打乱行序
c#

我现在有几个个txt文件,每个文件里面都是一行一行的数据,单个文件差不多1G, 我现在想把他们合并在一个txt文件中,并且打乱他们的行序,我原本想各个文件先读取几行,放在一个数组里面打乱写入新的文本,接着在读取这些文件接下来的几行,还是合并打乱写入,知道全部读完,但是我不知道怎么去控制这个每次读取那些行

5个回答

caozhy
caozhy   Ds   Rxr 2014.12.05 17:32

文本文件是没有办法随机读写的,如果你能得知每行的最大字符数(假定用maxcharsnum表示),你可以先将这些文本文件转换成随机文件(也就是每行文字放入二进制文件n*maxcharsnum起始的位置)。

有了随机文件,你可以用如下方式打乱它们的序号:
int[] rndlines = Enumerable.Range(0, 总行数).OrderBy(x => new Guid.NewGuid()).ToArray();
然后根据这个乱序的行号去那个随机文件中快速定位每一行,输出。

porenasckx
porenasckx   2014.12.05 16:00

你的想法挺好的,读取的话用StreamReader会自动的一行一行的读取的;

my_computer
my_computer   2014.12.05 16:01

可以生成一个随机数作为行数,读完一行就把这行删掉

wgw335363240
wgw335363240   2014.12.05 17:32

String sFilePath = "";
FileReader aFileReader = new FileReader(new File(sFilePath));
BufferedReader bfRedaer = new BufferedReader(aFileReader);
String sOneLine = null;

    //定义计数器
    int nLineCount=0;
    ArrayList tempLines = null;
    while ((sOneLine = bfRedaer.readLine()) != null) {

        if(tempLines==null){
            tempLines = new ArrayList(10);
        }
        tempLines.add(sOneLine);
        nLineCount ++;

        //这里对10的倍数行进行处理,如果最后一行不是10的倍数,没有处理的情况
        if(nLineCount%10==0){
            //提交给其他方法进行打乱排序写入到另一个文件
            tempLines = null;
        }
    }

    //对最后一行不是10的倍数进行处理
    if(tempLines!=null){
        //进行处理
    }
wgw335363240
wgw335363240 回复caozhy: 我这种方式是在一定程度上(10行文本)把文件的行随机了,楼主的意思应该是每次读取10行进行随机也能满足他们的要求。如果是完全的随机,无论是采取字节读取还是按行读取,都需要把字符完全读取到内存。如果非要完全随机,楼主可以通过把上面的大文件平均分成n个小文件,每个小文件存储相同行数的文本,利用函数对n个小文件中的行进行随机。按照随机后的结果,每次去读取知指定小文件中的指定行。这种效率比较低,但能实现你的功能。
大约 3 年之前 回复
wgw335363240
wgw335363240 上面的代码是提取一个文件的前10行文本内容
大约 3 年之前 回复
caozhy
caozhy 这个方法的问题是,如果数据量比较大,比如单个文本文件1GB,有好几个,那么就起码需要数GB的内存,甚至更多。本质上,这是利用了List的随机读取的功能,但是lz的需求,就必须用随机文件去解决了。
大约 3 年之前 回复
wang_ting910
wang_ting910   2014.12.09 11:32

可以生成一个随机数作为行数,读取的话用StreamReader会自动的一行一行的读取的;
不是随机的行数时,不要把内容写入的另一个记事本,直到读到指定的行时,再将此行内容写入的另一个记事本中,然后删除此行内容。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!