问题:我需要遍历文件夹中的多个文件并阅读它们。它们是.txt文件。在阅读时我需要注意每个文件中出现的单词。
例如:
文件1文字:“约翰是我的朋友朋友” - >单词:约翰,是,我的朋友
文件2文字:“John is Mark” - >单词:John,是,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中的单词)(朋友)。
答案 0 :(得分:0)
您不必为第一部分问题做很多事情:删除WriteAllLines
,移除ReadAllLines
"n.txt"
,将allLinesZ
变量重命名为{{1} }},并添加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());
的调用可确保如果同一个单词位于单个文件中,则不会计算两次。