输入文本文件并读取每行的第一个字符+计数出现次数

本文关键字:字符 第一个 文件 文本 读取 输入 | 更新日期: 2023-09-27 18:08:32

我试图计算文本文件每行第一个字符的出现次数。

示例文本文件:

Ab

交流

广告B

英航

输出示例:

A: 4

B: 2

这是我到目前为止的代码,问题是它不知道哪些字符是相同的,所以有多个迭代的A, B, C, D,等等…

    string line;    
    char firstChar;        
    private void selectFile()
    {
        openFileDialog1.Title = "Open Text File";
        openFileDialog1.Filter = "Text|*.txt";
        openFileDialog1.InitialDirectory = @"C:'";
        openFileDialog1.FileName = "";
        openFileDialog1.ShowDialog();
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            readFile();
        }
    }
    private void readFile()
    {
        int counter = 0;
        StreamReader readTxt = new StreamReader(openFileDialog1.FileName);
        while ((line = readTxt.ReadLine()) != null)
        {
            charFreq();            
            counter++;
        }
    }
    private void charFreq()
    {
        firstChar = line.ToCharArray()[0];
        var charFreq =
            from c in firstChar.ToString().ToCharArray()
            group c by c into groupFrequencies
            select groupFrequencies;
        foreach (var c in charFreq)
            rTxtOutput.Text += (String.Format("{0} : {1}", c.Key, c.Count())) + "'r'n";
    }

正确的方法是什么?谢谢!

输入文本文件并读取每行的第一个字符+计数出现次数

您可以使用LINQ的GroupBy:

var query = File.ReadLines(filePath).Where(line => !String.IsNullOrEmpty(line))
                                    .GroupBy(line => line.First());

如果您想考虑空行:

var query = File.ReadLines(filePath).GroupBy(line => line.FirstOrDefault());

所以这个方法应该是这样的:

void PrintCharCount(string filePath)
{
    if (!String.IsNullOrEmpty(filePath))
    {
         var query = File.ReadLines(filePath).Where(line => !String.IsNullOrEmpty(line))
                                             .GroupBy(line => line.First());
         foreach (var g in query)
             Console.WriteLine(g.Key + ": " + g.Count());
    }
}

您不需要使用StreamReader, File.ReadLines是为LINQ设计的,因为它返回IEnumerable<string>