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

时间:2015-05-01 12:12:40

标签: c# file stream iteration streamreader

问题:我需要遍历文件夹中的多个文件并阅读它们。它们是.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中的单词)(朋友)。

1 个答案:

答案 0 :(得分:0)

您不必为第一部分问题做很多事情:删除WriteAllLines,移除ReadAllLines "n.txt",将allLinesZ变量重命名为{{1} }},并添加logFileZToList来电:

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()); 的调用可确保如果同一个单词位于单个文件中,则不会计算两次。