Я пытаюсь выяснить, как разделить файл на количество строк в каждом файле. Это файлы csv, и я не могу сделать это по байтам. Мне нужно сделать это по линиям. 20k кажется хорошим числом для каждого файла. Каков наилучший способ чтения потока в данной позиции? Stream.BaseStream.Position? Итак, если бы я прочитал первые 20k строк, я бы начал позицию на 39999? Откуда я знаю, что я почти в конце файлов? Спасибо всемРазделить большой файл на более мелкие файлы по количеству строк в C#?
ответ
using (System.IO.StreamReader sr = new System.IO.StreamReader("path"))
{
int fileNumber = 0;
while (!sr.EndOfStream)
{
int count = 0;
using (System.IO.StreamWriter sw = new System.IO.StreamWriter("other path" + ++fileNumber))
{
sw.AutoFlush = true;
while (!sr.EndOfStream && ++count < 20000)
{
sw.WriteLine(sr.ReadLine());
}
}
}
}
Это кажется самым прямым для меня, хотя ради памяти я бы сбросил буфер записи с каждой записью, возможно. если каждая строка равна 100 байтам, что составляет 1000 строк 100 кбайт, а 20000 2 Мб, а не тонну памяти, но ненужную печать. –
@Jimmy - я добавил «AutoFlush = True», который автоматически сбрасывается после каждой записи. –
AutoFlush - это плохая идея в StreamWriter, поскольку она будет скрываться после каждого отдельного символа (я смотрел на код). Если вы не укажете размер буфера при создании StreamWriter, по умолчанию он будет содержать всего 128 символов, но это все равно лучше, чем никакого буфера. – Tergiver
Я хотел бы сделать это следующим образом:
// helper method to break up into blocks lazily
public static IEnumerable<ICollection<T>> SplitEnumerable<T>
(IEnumerable<T> Sequence, int NbrPerBlock)
{
List<T> Group = new List<T>(NbrPerBlock);
foreach (T value in Sequence)
{
Group.Add(value);
if (Group.Count == NbrPerBlock)
{
yield return Group;
Group = new List<T>(NbrPerBlock);
}
}
if (Group.Any()) yield return Group; // flush out any remaining
}
// now it's trivial; if you want to make smaller files, just foreach
// over this and write out the lines in each block to a new file
public static IEnumerable<ICollection<string>> SplitFile(string filePath)
{
return File.ReadLines(filePath).SplitEnumerable(20000);
}
Разве это не достаточно для вас? Вы говорите о переходе с позиции на позицию, но я не понимаю, почему это необходимо.
Это тоже работает !!!! Гоша. Мне нравится это место! – DDiVita
int index=0;
var groups = from line in File.ReadLines("myfile.csv")
group line by index++/20000 into g
select g.AsEnumerable();
int file=0;
foreach (var group in groups)
File.WriteAllLines((file++).ToString(), group.ToArray());
Вам нужно использовать 'File.ReadLines' вместо' ReadAllLines' - 'ReadAllLines' считывает все это в память сразу. Кроме того, использование функции «index» в функции группировки, подобной этой, вызывает меня. – mquander
изменен на ReadLines, спасибо –
+1 Это очень интересное использование linq – BlackICE
- 1. разделить большой файл на более мелкие файлы: справки о «расколе»
- 2. Как разбить большой текстовый файл на более мелкие файлы с равным количеством строк?
- 3. Разделить большой файл на мелкие файлы с определенным расширением
- 4. разделить большой файл на мелкие файлы с условием
- 5. Разделить большие XML-файлы на более мелкие фрагменты в php
- 6. Разделение файла на более мелкие файлы по строкам
- 7. Bash разделил большой файл на более мелкие файлы
- 8. Как разделить большой проект MFC на более мелкие проекты
- 9. Разделить большой объект на более мелкие вспомогательные объекты в примере
- 10. Разделить большой набор данных SAS на более мелкие наборы данных
- 11. Как разделить большой проект Java на более мелкие компоненты
- 12. Как разбить огромный файл на более мелкие файлы по алфавиту?
- 13. Как разбить большой файл на определенную точку на более мелкие?
- 14. Как разделить вывод mysqldump на более мелкие файлы?
- 15. Разделить большой блок malloc на более мелкие «разделы»
- 16. Разделить файл по количеству строк и рисунков в awk/perl
- 17. Как разбить route.rb на более мелкие файлы
- 18. python разделить файл на более мелкие куски эффективно
- 19. Разделить большой файл txt на более txtfiles
- 20. Разделить большой XML на более мелкие файлы на основе кусков дочерних узлов с помощью сценария unix
- 21. Как разделить NSString на более мелкие слова?
- 22. Разделить трехмерную матрицу на более мелкие «кубы»
- 23. Разделить большую строку на более мелкие куски в C#
- 24. Разделить список на более мелкие списки
- 25. Как разбить большой файл на более мелкие (более дружественный FTP) и объединить их позже?
- 26. Разделить текстовый файл на более мелкие файлы на основе размера (windows)
- 27. Batch большой список на более мелкие партии
- 28. Как читать очень большой текстовый файл (в gb) в .net C# и разбивать на мелкие файлы
- 29. Разбиение грамматик Bison на более мелкие файлы грамматики
- 30. Как разбить большой XML-файл на Perl :: XML :: Разделить на более мелкие куски?
Вы пробовали 20k звонки Readline? – strager
Вам не нужно искать вообще. Вы должны прочитать его по очереди, перейдя на новый файл, когда вы нажмете 20k. – Fosco
Да, после того, как я написал это и пошел, чтобы стричь волосы. Мне стало ясно, что я могу прочитать его, а затем сделать readline. Благодаря! – DDiVita