【问题标题】:Trying to count & List names in a txt file尝试在文本文件中计算和列出名称
【发布时间】:2019-10-30 08:14:31
【问题描述】:

我遇到以下问题: 我有一个包含大约两千个名称的 txt 文件,其中包含一堆重复的条目。我正在尝试创建一些东西,它将列出名称出现的次数。例如: 约翰·多伊 | 48次 简·多伊 | 20次 等等等等。

我在这里找到了关于如何计算这个的示例,但我完全不知道如何将这个输出到 RichTextbox 或其他文件中。

            .Select(s => new { Key = s.Key, Count = s.Count()})
            .ToDictionary(d => d.Key, d => d.Count);```

【问题讨论】:

  • 我们必须使用 linq 吗?
  • 你如何向我推荐你的数据,意味着你如何分割数据代表空间/输入等。 . .

标签: c# string linq counting


【解决方案1】:

数据输入到文件名.txt文件中。

约翰·迪奥 约翰·迪奥 约翰·迪奥 约翰威克 约翰威克 测试 测试

我已将文件放入名为 names.txt 的项目中,并在下面的代码中读取他。

string[] lines = File.ReadAllLines("../../names.txt"); 

然后将名称分组并打印到控制台应用程序中。

var mylines = lines.GroupBy(g => g).Select(s => new { Name = s, Count = s.Count() });
            foreach (var line in mylines)
            {
                Console.WriteLine($"{line.Name.Key} | {line.Count}");
            }  

结果#

约翰·迪奥 | 11 约翰威克 | 2 测试 | 5

【讨论】:

    【解决方案2】:

    有许多不同的方法可以做到这一点。如果您只想确定计数及其显示方式无关紧要,那么您可以将计数输出到 CSV 文件并使用 Excel 进行查看。在下面的简单示例中,我不确切知道您的名称是如何格式化的,我假设每行一个名称。

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (var reader = new StreamReader("names.txt"))
                {
                    var names = GetNames(reader).ToLookup(k => k);
    
                    using (var writer = new StreamWriter("names.counted.csv"))
                    {
                        foreach (var name in names)
                        {
                            writer.WriteLine($"{name.Key},{name.Count()}");
                        }
                    }
                }
    
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.ToString());
            }
        }
    
        static IEnumerable<string> GetNames(TextReader reader)
        {
            string line;
            while ((line = reader.ReadLine()) != null)
                yield return line;
        }
    }
    

    【讨论】:

      【解决方案3】:

      假设:

      假设我们已经在 List&lt;string&gt; 对象中拥有文本文件的每一行,我们将调用 names,并且文本文件中的每一行代表一个拼写正确的全名。

      分组/打印数据:

      使用 LINQ,我们可以将这些值自己分组(类似于 SQL),然后将 IGrouping 结果转换为我们希望稍后在应用程序中使用的对象。例如:

      var totals = names.GroupBy(x => x)
          .Select(group => new { Name = group.Key, Count = group.Count() });
      
      foreach ( var total in totals )
      {
          Console.WriteLine($"{total.Name} | {total.Count} times");
      }
      

      另一种选择是使用您现有的代码并打印出字典的值

      var totals = names
          .Select(s => new { Key = s.Key, Count = s.Count()})
          .ToDictionary(d => d.Key, d => d.Count);
      
      foreach ( var kvp in totals )
      {
          Console.WriteLine($"{kvp.Key} | {kvp.Value} times");
      }
      

      保存/显示数据:

      如果您想做其他事情然后打印到控制台,您可以简单地将数据操作为您想要的值。例如,如果您想将其保存到另一个文件:

      var csvContent = totals
          .Select(total => $"{total.Name},${total.Count} times")
          .ToArray();
      
      File.WriteAllLines(filePath, csvContent);
      

      或者你可以创建一个字符串(例如上面的:String.Join("\n", csvContent))并更新一个 RichTextBox like so

      【讨论】:

        【解决方案4】:

        您可以遍历查询结果并将每个名称/计数添加到 StringBuilder,然后将最终字符串输出到您的 RichTextBox:

        StringBuilder sb = new StringBuilder();
        foreach(var KVP in yourDictionaryVariableName)
        {
            sb.AppendLine(KVP.Key + " | " + KVP.Value.ToString());
        }
        richTextBox1.Text = sb.ToString();
        

        【讨论】:

          猜你喜欢
          • 2023-01-02
          • 2021-11-24
          • 2015-06-15
          • 2015-10-12
          • 2016-03-12
          • 1970-01-01
          • 1970-01-01
          • 2011-10-17
          • 1970-01-01
          相关资源
          最近更新 更多