【问题标题】:Read from a file and count the words in a list从文件中读取并计算列表中的单词
【发布时间】:2016-03-19 13:04:13
【问题描述】:

我正在使用 C# 读取一个 csv 文件并在新行中吐出所有单词。然后我想计算该文件中每个单词在列表中重复的次数。我得到的输出不计算单词。请参阅以下信息

csv 文件内容: 她人很好 他可以很好 哇哦,太棒了

这是代码:

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var list = File.ReadAllLines("Try3.csv");
        foreach (string line in File.ReadAllLines("Try3.csv"))

        { 
            string[] parts = line.Split(' ');
            foreach (string part in parts)
            {

                var q = list.GroupBy(x => x)
                    .Select(g => new {Value = g.Key, Count = g.Count()})
                    .OrderByDescending(x=>x.Count);
                foreach (var x in q){
                Console.WriteLine("{0}",part+" Count:"+ x.Count);
        }


    }
    }   
  }
   }

这是我得到的输出:

[]

有什么想法吗?

【问题讨论】:

  • 这是学习how to use a debugger 的绝佳机会。首先,为什么要将字符串拆分为单词,然后对每个单词进行分组操作?
  • 我讨厌迂腐,但这不是 CSV 文件,它是简单的文本。 :)

标签: c#


【解决方案1】:

试试这个

var results = File.ReadLines("Try3.cvs")
                  .SelectMany(line => line.Split(' '))
                  .GrooupBy(word => word)
                  .ToDictionary(g => g.Key, g => g.Count());

首先使用File.ReadLines 意味着您一次只读取一行,而不是在处理之前将整个文件加载到内存中。如果文件很大,这会很有帮助。然后,只需将行拆分为单词,然后对这些单词进行分组以创建一个字典,该字典将以单词为键,并将其在文件中出现的次数作为值。

要按计数顺序获取结果,您可以选择执行以下操作。

var results = File.ReadLines("Try3.cvs")
                  .SelectMany(line => line.Split(' '))
                  .GrooupBy(word => word)
                  .OrderByDescending(g => g.Count())
                  .Select(g => new { Word = g.Key, Count = g.Count() })
                  .ToList();

【讨论】:

  • 这似乎与他的代码相同,只是您使用了Dictionary<K,V> 而不是匿名对象?而你遗漏了订单。
  • @CodingGorilla 对于初学者来说,这不会两次读取整个文件。此外,它实际上会产生一个单词和计数的键值对。
  • 不,你是对的,这里的关键是你在parts 上去掉了不必要的foreach,抱歉我不得不重新阅读他的代码几次。 :)
  • 您应该添加他的OrderByDescending 才能完整。
  • @CodingGorilla 自从我开始创建字典以来,排序应该无关紧要。但由于 OP 确实使用了它,那么字数列表可能更有意义。
猜你喜欢
  • 2016-08-06
  • 1970-01-01
  • 2016-08-10
  • 2019-04-24
  • 1970-01-01
  • 2013-03-08
  • 2020-10-12
  • 2021-09-14
  • 2023-03-18
相关资源
最近更新 更多