c#如何计算文本文件中的行数
这样做有什么问题吗c#如何计算文本文件中的行数,c#,C#,这样做有什么问题吗 int i = new StreamReader("file.txt").ReadToEnd().Split(new char[] {'\n'}).Length 这样做的问题是,在对大文件执行此操作时,会分配大量内存 我宁愿逐行读取文件并手动递增计数器。这可能不是一行程序,但它的内存效率要高得多 或者,您可以加载大小均匀的数据块,并计算这些数据块中的换行次数。这可能是最快的方法。当然-它将整个流读取到内存中。这很简单,但我今天可以创建一个文件,它将很难通过 一次读取一个字
int i = new StreamReader("file.txt").ReadToEnd().Split(new char[] {'\n'}).Length
这样做的问题是,在对大文件执行此操作时,会分配大量内存 我宁愿逐行读取文件并手动递增计数器。这可能不是一行程序,但它的内存效率要高得多
或者,您可以加载大小均匀的数据块,并计算这些数据块中的换行次数。这可能是最快的方法。当然-它将整个流读取到内存中。这很简单,但我今天可以创建一个文件,它将很难通过 一次读取一个字符,并增加换行符上的计数 编辑-经过一些快速的研究 如果你想要简洁,想要那种闪亮的新感觉,请考虑一下:
public class StreamEnumerator : IEnumerable<char>
{
StreamReader _reader;
public StreamEnumerator(Stream stm)
{
if (stm == null)
throw new ArgumentNullException("stm");
if (!stm.CanSeek)
throw new ArgumentException("stream must be seekable", "stm");
if (!stm.CanRead)
throw new ArgumentException("stream must be readable", "stm");
_reader = new StreamReader(stm);
}
public IEnumerator<char> GetEnumerator()
{
int c = 0;
while ((c = _reader.Read()) >= 0)
{
yield return (char)c;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
这给了你一个简洁的lambda表达式来做(或多或少)你想做的事情
我还是喜欢旧的Skool:
public static int CountLines(Stream stm)
{
StreamReader _reader = new StreamReader(stm);
int c = 0, count = 0;
while ((c = _reader.Read()) != -1)
{
if (c == '\n')
{
count++;
}
}
return count;
}
注意:Environment.NewLine版本留给读者作为练习假设该文件存在,并且您可以打开它,那么它就可以工作了
它的可读性和安全性都不太好…如果您正在寻找一个简短的解决方案,我可以给您一个简单的说明,至少可以让您不必拆分结果:
int i = File.ReadAllLines("file.txt").Count;
但这与将大文件读入内存的问题是一样的。你真的应该使用streamreader,在阅读时计算换行符,直到到达文件末尾。你发布的方法不是特别好。让我们把它分开:
// new StreamReader("file.txt").ReadToEnd().Split(new char[] {'\n'}).Length
// becomes this:
var file = new StreamReader("file.txt").ReadToEnd(); // big string
var lines = file.Split(new char[] {'\n'}); // big array
var count = lines.Count;
实际上,您在内存中保存此文件两次:一次读取所有行,一次将其拆分为数组。垃圾收集器讨厌这样
如果您喜欢单行程序,可以编写System.IO.File.ReadAllLines(filePath.Length)
,但这样仍然可以检索数组中的整个文件。如果你不想抓住阵列,那么这样做是没有意义的
更快的解决方案是:
int TotalLines(string filePath)
{
using (StreamReader r = new StreamReader(filePath))
{
int i = 0;
while (r.ReadLine() != null) { i++; }
return i;
}
}
上面的代码在任何给定时间在内存中最多保存一行文本。只要线路相对较短,它就会有效率。可能是这样吗
string file = new StreamReader("YourFile.txt").ReadToEnd();
string[] lines = file.Split('\n');
int countOfLines = lines.GetLength(0));
这应该可以做到:
使用System.Linq;
....
int i=File.ReadLines(File.Count();
在搜索Environment.NewLine时,这不起作用,它通常是一个两个字符的字符串(CrLf)。不过,他的想法是正确的。那么,使用正则表达式搜索Environment.NewLine的实例如何?重复:这是否回答了您的问题?忘记放括号了:int i=File.ReadAllLines(“File.txt”).Count();
string file = new StreamReader("YourFile.txt").ReadToEnd();
string[] lines = file.Split('\n');
int countOfLines = lines.GetLength(0));