2016-06-15 4 views
0

Возможно ли создать набор данных с помощью случайной выборки и ограничить размер вывода?Ограничение случайной выборки по размеру файла

У меня есть входной файл ~ 260 МБ, и я хочу сгенерировать файлы разного размера (~ 1 МБ, ~ 5 МБ, ~ 10 МБ, ...), в которых записи генерируются случайным образом из исходного файла.

Какой лучший подход к этому?

ответ

0

Самый простой способ - прочитать файл и пропустить строки при выводе их.

Вы используете модуль (%), чтобы получить каждую n-ю строку. Установите строки пропуска в размере вашего файла образца/размера требуемого файла. Например, 260 МБ/5 МБ = 52, поэтому установите оператор% на 52, и вы должны получить файл около 5 МБ.

Вот краткий пример:

 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")); 
     } 
+0

Таким образом, каждый раз создается один и тот же файл 5 МБ. правильно? Мне нужны файлы размером 5 МБ, которые МОГУТ меняться, но не каждый раз. Моя первоначальная реализация - выбрать случайный элемент и пропустить _n_ количество элементов. Но я не могу определить размер файла для вывода. Как я могу создать различное содержимое для каждого созданного файла? Или есть способ предопределить/оценить размер файла до его написания? – Awoi

+0

answerd выше с редактированием. –

 Смежные вопросы

  • Нет связанных вопросов^_^