是否可以通过随机采样生成数据集并限制输出的大小?
我有~260MB文本文件的输入,我想生成不同大小的文件(~1MB,~5MB,~10MB,...),其中条目是从源文件中随机生成的。
最好的方法是什么?
答案 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"));
}