尝试计算和列出txt文件中的名称

时间:2019-06-16 13:41:46

标签: c# string linq counting

我在以下方面遇到一些问题: 我有一个大约有两千个名字的txt文件,其中有一堆重复的条目。我正在尝试创建将列出名称出现次数的内容。因此,例如: 约翰·杜48次 简·杜20次 等等

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

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

4 个答案:

答案 0 :(得分: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}");
            }  

结果#

John Deo | 11 约翰·威克| 2 测试5

答案 1 :(得分:0)

有很多不同的方法可以做到这一点。如果您只需要确定计数及其显示方式无关紧要,则可以将计数输出到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;
    }
}

答案 2 :(得分:0)

假设:

假设我们已经将List<string>对象中的文本文件的每一行都称为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

答案 3 :(得分:0)

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

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