【问题标题】:Iterating multiple txt files in folder to read them in C#迭代文件夹中的多个 txt 文件以在 C# 中读取它们
【发布时间】:2015-05-01 12:12:40
【问题描述】:

问题:我需要遍历文件夹中的多个文件并阅读它们。它们是 .txt 文件。阅读时我需要注意每个文件中出现的单词。

例如:

文件 1 文本:“约翰是我的朋友朋友”-> 词:约翰,是,我的,朋友

文件 2 文本:“John is Mark” -> 单词:John, is, Mark

目前我正在读取文件,然后将其制成一个大文件,但它不能像这样工作,所以我必须单独阅读它们。老想法:

string[] filesZ = { "1.txt", "2.txt" };

var allLinesZ = filesZ.SelectMany(i => System.IO.File.ReadAllLines(i));
System.IO.File.WriteAllLines("n.txt", allLinesZ.ToArray());

var logFileZ = File.ReadAllLines("n.txt");

所以这是第一个问题,如何在不制作大文件的情况下遍历它们并读取所有这些。

第二个是如何对单独文件的所有单词进行计数,目前我正在使用一个大文件:

var logFileZ = File.ReadAllLines("n.txt");

List<string> LogListZ = new List<string>(logFileZ);

var fi = new Dictionary<string, int>();
LogListZ.ForEach(str => AddToDictionary(fi, str));

foreach (var entry in fi)
{
    Console.WriteLine(entry.Key + ": " + entry.Value);
}

这是 AddToDictionary:

static void AddToDictionary(Dictionary<string, int> dictionary, string input)
{
    input.Split(new[] { ' ', ',', '.', '?', '!', '.' }, StringSplitOptions.RemoveEmptyEntries).ToList().ForEach(n =>
    {
        if (dictionary.ContainsKey(n))
            dictionary[n]++;
        else
            dictionary.Add(n, 1);
    });
}

我正在考虑对所有文件进行循环(可能吗?)并在里面创建一个计数器来计算单词,例如 John 在多少个文件中。我不需要一个特定的文件号,只需要一个单词的出现次数,而不需要计算(如示例文件 1 中的)单词两次(朋友)。

【问题讨论】:

    标签: c# file stream iteration streamreader


    【解决方案1】:

    您不必为问题的第一部分做太多事情:删除WriteAllLines,删除"n.txt"ReadAllLines,将allLinesZ 变量重命名为logFileZ,然后添加ToList 或@ 987654327@电话:

    var logFileZ = filesZ
        .SelectMany(i => System.IO.File.ReadAllLines(i))
        .ToList();
    

    您也可以一次性创建一个计数器:随时拆分每个字符串,将其提供给SelectMany,使用GroupBy,然后使用Count() 作为值转换为字典:

    var counts = filesZ
        .SelectMany(i => System.IO.File.ReadAllLines(i)
            .SelectMany(line => line.Split(new[] { ' ', ',', '.', '?', '!', '.' })
            .Distinct())
        .GroupBy(word => word)
        .ToDictionary(g => g.Key, g => g.Count());
    

    Distinct() 的调用确保了同一个单词在单个文件中不会被计算两次。

    【讨论】:

    • 但是counts字典并没有改变任何东西,它只是看起来像fi字典。
    • @Ken'ichiMatsuyama 你什么意思? counts 应该有成对的 word->N,其中 N 是该单词在来自 fileZ 数组的所有文件中出现的次数。
    • 是的,bt我想排除重复对,所以一个文件中的朋友朋友只计为一个,但两个文件中的朋友朋友仍然是两个。这是我有墙的问题..
    • 我会再发表评论,目前我有一本包含所有对的字典,是的。我可以使计数的单词数为 1,但那样我会丢失文件数。我想知道“约翰”这个词例如在 5 个文件中的 3 个文件中,即使它在 1 个文件中是 17 次,我仍然想获得数字 3,而不是 19(如果在其他两个文件中它只是一次) .
    • @Ken'ichiMatsuyama 啊,我明白了。我会在几分钟后修改查询。
    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2020-03-31
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多