计算文件/流中的字符数

时间:2013-01-16 16:55:22

标签: .net encoding filestream

如何获取流/文件的字符(而不是字节)的长度?我们假设文件/流的编码是已知的(在运行时)。

我宁愿不将整个流加载到内存中,所以我反对使用TextReader.ReadToEnd()

3 个答案:

答案 0 :(得分:1)

除非编码是固定宽度的(每个字符的字节数相同 - 例如ASCII而不是UTF-8),否则你需要读取整个文件 - 但它不需要在记忆。例如:

public long CountCharacters(TextReader reader)
{
    char[] buffer = new char[8 * 1024]; 
    long total = 0;
    int charsRead;
    while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
    {
        total += charsRead;
    }
    return total;
}

像这样使用:

using (var reader = File.OpenText("file.txt", Encoding.UTF8))
{
    Console.WriteLine(CountCharacters(reader));
}

请注意,这将计算UTF-16代码单元,这与Unicode字符或可显示的字形不完全相同,但在大多数情况下,它将足够好。 (考虑诸如组合字符和代理对的情况。)

答案 1 :(得分:0)

这是我到目前为止所拥有的:

Stream stream = file.OpenRead("file.txt");
Encoding encoding = Encoding.Default; //or whatever

TextReader reader = new StreamReader(stream, encoding);
var buf = new char[4096];
long total=0;
long crt;
while ((crt = reader.Read(buf, 0, 4096)) > 0)
{
   total += crt;
}

return total;

答案 2 :(得分:0)

这取决于编码。如果是固定长度编码,则将字节长度除以字符大小,如果它是可变长度编码,则在文件处理之前不可知。