搜索多个文本文件中的单词列表

时间:2017-01-26 16:16:59

标签: c#

我想搜索多个文本文件中的单词列表,并计算包含单词的文件数。

我的代码需要很长时间才能达到数小时。

        uniqword = File.ReadAllLines(@"H:\\backstage\my work\uniqword.txt").ToList();
        string[] allfile = Directory.GetFiles(@"H:\\backstage\my work\categories file text\categories", "*.txt");
        var no_doc_word = new Dictionary<string, int>();

            foreach (string ff1 in allfile)// read one file in files until finish
            {
            List<string> allLinesText = File.ReadAllLines(ff1).ToList();

            foreach (string word in uniqword)
               {
                if (allLinesText.Contains(word))
                    if (no_doc_word.ContainsKey(word))
                        no_doc_word[word]++;
                    else
                        no_doc_word.Add(word, 1);

            }
        }

2 个答案:

答案 0 :(得分:1)

您可以在阅读文件时检查单词并计算它们:

async Task Contains(string file)
{
    using ( StreamReader reader = new StreamReader(File.OpenRead(file))
    {
        string line = string.Empty;
        while( (line = reader.ReadLine()) != null)
        {
            string[] words = line.Split(new char[] { ' ', ',', '.' });
            foreach(string word in uniqword)
            {
                int howMany = words.Count(w => w.Equals(word);
                if (no_doc_word.ContainsKey(word))
                    no_doc_word[word] += howMany;
                else
                    no_doc_word.Add(word, howMany);
            }
        }
    }
}

由于这是异步的,你甚至可以多次调用它:

public void Check()
{
    string[] files = new string[] { @"C:\file1.txt", @"C:\file2.txt" };
    List<Task> tasks = new List<Task>();
    foreach(string file in files)
        tasks.Add(Contains(file));

    Task.WaitAll(tasks.ToArray());
}

编辑:

使用此方法的好处是所有文件(或几乎所有文件)都在同一时间处理。

答案 1 :(得分:0)

根据实际的瓶颈情况,可以做到这一点很简单(评论中的解释):

 <select id="btn1">
     <option>Export</option>
     <option id="csv" data>CSV</option>
     <option id="xls" >XLS</option>
 </select>