随机采样限制按文件大小

时间:2016-06-15 06:48:11

标签: c# asp.net asp.net-mvc-5 statistics random-sample

是否可以通过随机采样生成数据集并限制输出的大小?

我有~260MB文本文件的输入,我想生成不同大小的文件(~1MB,~5MB,~10MB,...),其中条目是从源文件中随机生成的。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

最简单的方法是在输出时读取文件并跳过行。

使用模数(%)获取每第n行。将跳过行设置为示例文件的大小/ require文件的大小。例如260MB / 5MB = 52,所以将%运算符设置为52,你应该得到一个大约5mb的文件。

这是一个简单的例子:

        StreamReader inputFile = new StreamReader(File.OpenRead("c:\\bigfile.csv"));

        StreamWriter outputFile = new StreamWriter(File.OpenWrite("c:\\smallfile.csv"));

        int rowCount = 0;
        while(!inputFile.EndOfStream)
        {
            string line = inputFile.ReadLine();

            if (rowCount % 1000 == 1)
                outputFile.WriteLine(line);

            rowCount++;
        }

根据要求使用随机数发生器。使用这个版本,计算出5mb会产生多少行(我已经投入了100,000)。然后,这将随机循环通过文件,直到它加载100,000行。如果它在获取所有行之前完成,它就会再次开始读取文件。这将非常'随机的。

        StreamReader inputFile = new StreamReader(File.OpenRead("c:\\bigfile.csv"));

        StreamWriter outputFile = new StreamWriter(File.OpenWrite("c:\\smallfile.csv"));

        Random rand = new Random(Guid.NewGuid().GetHashCode());

        int rowCount = 0;
        int rowsUsed = 0;
        skipCount = rnd.Next(1, 2000);

        while(rowsUsed < 100000)
        {
         while(!inputFile.EndOfStream || rowsUsed > 100000)
         {
            string line = inputFile.ReadLine();

            if (rowCount % skipCount == 1)
            {
                outputFile.WriteLine(line);
                skipCount = rnd.Next(1, 2000);
            }

            rowCount++;
         }

         StreamReader inputFile = new StreamReader(File.OpenRead("c:\\bigfile.csv"));
        }