我想弄清楚如何分割每个文件中的行数。这些文件是csv,我不能按字节来完成。我需要通过线路来完成。 20k似乎是每个文件的好数字。在特定位置阅读流的最佳方式是什么? Stream.BaseStream.Position?所以如果我读了第一条20k线,我会开始在39,999的位置?我怎么知道我几乎在文件的末尾?感谢所有通过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行100k和20000 2Mb,这不是一吨内存,而是一个不必要的脚印。 – 2010-07-30 18:06:14
@Jimmy - 我添加了'AutoFlush = True',每次写入后自动刷新。 – 2010-07-30 18:16:10
AutoFlush在StreamWriter上是个不错的主意,因为它会在每个单个字符(我看过代码)后刷新。如果您在创建StreamWriter时未指定缓冲区大小,则默认只有128个字符,但仍然比没有缓冲区更好。 – Tergiver 2010-07-30 19:37:03
我会做这样的:
// 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 2010-07-30 18:55:44
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());
- 1. 如何将某个特定点的大文件分割成更小的文件?
- 2. 根据日期将大日志文件分割成更小的文件
- 3. 如何使用VB.NET 2003将大文件分割成更小的文件?
- 4. 使用文本分隔符将25mb .txt文件分割成更小的文件
- 5. 如何使用MATLAB将每个空行上的大文本文件分割成更小的文本文件?
- 6. 将配置文件切割成大小
- 7. VC:如何将大的.lib分割成小的.lib文件
- 8. C#将大型excel文件拆分为更小的文件
- 9. 将一个大的javascript文件分割成几个较小的文件
- 10. 动态地将文件分割成多个较小的文件
- 11. 将一个巨大的excel文件分割成多个文件
- 12. Shell命令将大文件分割成10个较小的文件
- 13. 分裂大文件分成小文件
- 14. 用tar命令将文件分割成特定大小
- 15. 将大型XML文件分割成小块
- 16. 通过列的值有效地将一个文件分割成多个文件
- 17. 分割自动生成的C#文件
- 18. 如何通过分隔列将文本文件逐行分割成2个文本文件?
- 19. 将文件夹拆分成一定大小的文件夹
- 20. 将文本文件分割成大小相同的文件,而不会在JAVA中打破文字
- 21. Perl将文本文件分割成块
- 22. 骆驼骨料线和分割成不同大小的文件
- 23. 如何通过Python中的字符串分隔符将文件分割成块
- 24. 文件大小通过JavaScript
- 25. 如何到Android的build.gradle文件分割成文件与更小的任务
- 26. BASH shell脚本来一个大的XML文件分割成多个小文件
- 27. 根据Python中的值差异将列文本文件分割成更小的文件
- 28. 使用PHP将大型KML文件分隔成更小的文件
- 29. 把野牛语法分割成更小的语法文件
- 30. 如何使用行数将文本文件分割成2个文件?
您是否尝试过20K调用READLINE? – strager 2010-07-30 17:41:35
你根本不需要去寻求。你应该逐行阅读它,一旦你打到20k就切换到一个新的文件。 – Fosco 2010-07-30 17:42:29
是的,我写完这些后就去剪发了。它让我明白,我可以阅读它最后并做一个readline。谢谢! – DDiVita 2010-07-30 18:55:05