迭代文件夹中的多个txt文件以在C#中读取它们
Iterating multiple txt files in folder to read them in C#
问题:我需要遍历文件夹中的多个文件并读取它们。它们是 .txt 文件。阅读时我需要注意每个文件中出现的单词。
例如:
文件 1 文本:"John is my friend friend" -> 单词:John, is, my, friend
文件 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 中)单词两次(朋友)。
您不必为问题的第一部分做太多事情:删除 WriteAllLines
,删除 "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()
保证同一个词在同一个文件中不会被统计两次
问题:我需要遍历文件夹中的多个文件并读取它们。它们是 .txt 文件。阅读时我需要注意每个文件中出现的单词。
例如:
文件 1 文本:"John is my friend friend" -> 单词:John, is, my, friend
文件 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 中)单词两次(朋友)。
您不必为问题的第一部分做太多事情:删除 WriteAllLines
,删除 "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()
保证同一个词在同一个文件中不会被统计两次