新手:需要读取文件并获取字符频率

时间:2013-01-29 16:09:12

标签: c#

我刚刚开始学习C#,遇到了一个问题,我的书都无法告诉我如何解决。

我想读取一个文本文件,并希望将其放入bytearray(BinaryReader?)并确定所有字节的频率[0..255]。

Image of application

更新:

这让我得到了理想的结果:

        byte[] bar = File.ReadAllBytes("a.txt");
        long[] far = new long[256];

        foreach (byte b in bar)
        {                
            ++far[b];
        }

Thanxs为所有帮助和努力的人,我真的很感激;)

5 个答案:

答案 0 :(得分:6)

  

我想读取一个文本文件并希望将其放入bytearray(BinaryReader?)并确定所有字节的频率[0..255]。

  1. 将文本文件读入字节:System.IO.File.ReadAllBytes
  2. 使用foreach循环
  3. 循环遍历每个字节
  4. 在表示找到的每个字节的合适数据结构中增加一个整数
  5. 奖励积分和陷阱:

    1. 处理大(1GB)文件而不将其完全读入内存(提示:检出System.IO.Stream命名空间)
    2. Unicode(提示:并非所有语言都有每个字符1个字节。请查看System.Text命名空间)

答案 1 :(得分:2)

这可能是最有效的方式

int b;
var stats = new int[255];
using (var fs = File.OpenRead(@"file path"))
{
    while(-1 != (b = fs.ReadByte()))
        stats[b]++;
}

答案 2 :(得分:0)

要从文件中读取 ALL 字节,您需要做的就是:

byte[] data = File.ReadAllBytes("MyFileName");

详情请见此处:http://msdn.microsoft.com/en-us/library/system.io.file.readallbytes.aspx

我假设您正在阅读的文本文件是ASCII还是ANSI?因为如果不是,你不能只把它读作字节,因为有些字符可能不是1个字节长。

无论如何,在拥有字节数据数组之后,您可以遍历它以确定每个字节的总出现次数:

int[] totals = new int[256];

foreach (byte b in data)
{
    ++totals[b];
}

注意:如果任何字节超过2 ^ 31次,则会失败。我猜它不会发生。 ;)

我不确定“频率”是什么意思。你能定义它吗?

答案 3 :(得分:0)

试试这个:

byte[] bytes = System.IO.File.ReadAllBytes("file.txt");

        var groups = bytes.GroupBy(x => x);

        foreach (var group in groups)
        {
            Console.WriteLine(string.Format("{0} : {1}", group.Key, group.Count()));
        }

        Console.ReadLine();

答案 4 :(得分:0)

对于挑战,在LINQ:

byte[] content = File.ReadAllBytes(myFileName);

var groups = (from character in content 
              group character by character).ToDictionary(g => g.Key, g => (float)g.Count() / content.Length);
float[] stats = (from character in Enumerable.Range(0, 255)
                 select groups[character]).ToArray();

我在LINQ中找不到更简单的方法。