C# 迭代文件夹中的多个txt文件以在C中读取它们#

C# 迭代文件夹中的多个txt文件以在C中读取它们#,c#,file,stream,iteration,streamreader,C#,File,Stream,Iteration,Streamreader,问题:我需要遍历文件夹中的多个文件并读取它们。它们是.txt文件。阅读时,我需要记下每个文件中出现的单词 例如: 文件1文本:“约翰是我的朋友”->单词:约翰,是,我的朋友 文件2文本:“约翰是马克”->单词:约翰,是,马克 目前我正在读取文件,然后将其制作成一个大文件,但它不能像这样工作,所以我必须单独读取它们。旧观念: string[] filesZ = { "1.txt", "2.txt" }; var allLinesZ = filesZ.SelectMany(i => Syst

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

例如:

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

文件2文本:“约翰是马克”->单词:约翰,是,马克

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

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);
}
var logFileZ=File.ReadAllLines(“n.txt”);
List LogListZ=新列表(logFileZ);
var fi=新字典();
ForEach(str=>AddToDictionary(fi,str));
foreach(fi中的var条目)
{
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);
    });
}
static void AddToDictionary(字典、字符串输入)
{
input.Split(new[]{'、'、'、'、'、'?'、'!'、'.},StringSplitOptions.RemoveEmptyEntries.ToList().ForEach(n=>
{
if(字典ContainsKey(n))
字典[n]++;
其他的
添加(n,1);
});
}

我想在所有文件中做一个循环(有可能吗?),在里面做一个计数器,计算单词的数量,例如John,它是多少个文件。我不需要一个特定的文件号,只需要一个单词出现的次数,而不需要计算两次(如示例文件1)单词(friend)。

对于问题的第一部分,您不需要做太多工作:删除
writeAllines
,删除
n.txt的
ReadAllLines
,将
allLinesZ
变量重命名为
logFileZ
,并添加
ToList
ToArray
调用:

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()
确保同一个单词在单个文件中不会被计数两次。

但是计数字典不会改变任何东西,它看起来就像fi字典。@Ken'ichiMatsuyama你是什么意思
counts
应该有对
word
->
N
,其中
N
是单词在
fileZ
数组中的所有文件中出现的次数。是的,bt我想排除可重复的对,因此一个文件中的朋友只算作一个,但两个文件中的朋友仍然是两个。这是一个问题,我有一堵墙。我会再做一个评论,现在我有一本包含所有对的字典。我可以使计数的字数为1,但这样会丢失文件数。我想知道单词“John”在5个文件中的3个文件中,即使在1个文件中是17次,我仍然想得到数字3,而不是19(如果在其他两个文件中只有一次)。@Ken'ichiMatsuyama啊,我明白了。我将在几分钟后修改查询。