如何搜索多个字符串并为它们保留计数器

时间:2015-07-23 17:40:54

标签: c# search

我想要做的是以下内容 - 我有数百个日志文件,我需要搜索并进行一些计数。基本思路是这样,拿一个.txt文件,读取每一行,如果找到搜索项1,增加搜索项1的计数器,如果找到搜索项2,增加搜索项2的计数器等等on ..例如,如果文件包含类似......

的内容
a b c
d e f
g h i
j k h

如果我指定searchablese& h,输出应该说

e : 1
h : 2 

搜索条件的数量是可扩展的,基本上用户可以提供1个搜索号码或10个,因此我不确定如何根据可搜索的数量实现n个计数器。

以下是我到目前为止所做的,它只是一个基本方法,可以看到哪些有用,哪些无效...现在,它只保留其中一个搜索项的计数。目前,我正在将结果写入控制台以进行测试,最终,它将被写入.txt.xlsx。任何帮助将不胜感激!

string line;
int Scounter = 0;
int Mcounter = 0;
List<string> searchables = new List<string>();

private void search_Log(string p)
{
    searchables.Add("S");
    searchables.Add("M");

    StreamReader reader = new StreamReader(p);
    while ((line = reader.ReadLine()) != null)
    {
        for (int i = 0; i < searchables.Count(); i++)
        {
            if (line.Contains(searchables[i]))
            {
                Scounter++;                     
            }
        }
    }
    reader.Close();
    Console.WriteLine("# of S: " + Scounter);
    Console.WriteLine("# of M: " + Mcounter);
}

4 个答案:

答案 0 :(得分:4)

一种常见的方法是使用Dictionary<string, int>来跟踪值和计数:

// Initialise the dictionary:
Dictionary<string, int> counters = new Dictionary<string, int>();

然后:

if (line.Contains(searchables[i]))
{
    if (counters.ContainsKey(searchables[i]))
    {
        counters[searchables[i]] ++;
    }
    else
    {
        counters.Add(searchables[i], 1);
    }
}

然后,当你完成处理时:

// Add in any searches which had no results:
foreach (var searchTerm in searchables)
{
    if (counters.ContainsKey(searchTerm) == false)
    {
         counters.Add(searchTerm, 0);
    }
}

foreach (var item in counters)
{
     Console.WriteLine("Value {0} occurred {1} times", item.Key, item.Value);
}

答案 1 :(得分:2)

你可以在这里使用linq:

App.Page = Page

输入:

  
    

a b c
    d e f

  

输出:

  
    

a:1
       b:1
       c:1
       d:1

       e:1
       f:1

  

答案 2 :(得分:2)

你可以使用一个类来搜索:

public class Searchable
{
     public string searchTerm;
     public int count;
}

然后

while ((line = reader.ReadLine()) != null)
{
    foreach (var searchable in searchables)
    {
        if (line.Contains(searchable.searchTerm))
        {
            searchable.count++;                     
        }
    }
}

这是跟踪多个搜索字词及其计数的众多方法之一。

答案 3 :(得分:1)

此版本将计算每个文件行发生1 ^ n次的1 ^ n个搜索词。它说明一个术语在一行上存在多次的可能性。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<string, string[], Dictionary<string, int>> searchForCounts = null;
            searchForCounts = (filePathAndName, searchTerms) =>
            {
                Dictionary<string, int> results = new Dictionary<string, int>();
                if (string.IsNullOrEmpty(filePathAndName) || !File.Exists(filePathAndName))
                    return results;
                using (TextReader tr = File.OpenText(filePathAndName))
                {
                    string line = null;
                    while ((line = tr.ReadLine()) != null)
                    {
                        for (int i = 0; i < searchTerms.Length; ++i)
                        {
                            var searchTerm = searchTerms[i].ToLower();
                            var index = 0;
                            while (index > -1)
                            {
                                index = line.IndexOf(searchTerm, index, StringComparison.OrdinalIgnoreCase);
                                if (index > -1)
                                {
                                    if (results.ContainsKey(searchTerm))
                                        results[searchTerm] += 1;
                                    else
                                        results[searchTerm] = 1;
                                    index += searchTerm.Length - 1;
                                }
                            }
                        }
                    }
                }
                return results;
            };
            var counts = searchForCounts("D:\\Projects\\ConsoleApplication5\\ConsoleApplication5\\TestLog.txt", new string[] { "one", "two" });
            Console.WriteLine("----Counts----");
            foreach (var keyPair in counts)
            {
                Console.WriteLine("Term: " + keyPair.Key.PadRight(10, ' ') + " Count: " + keyPair.Value.ToString());
            }
            Console.ReadKey(true);
        }
    }
}

Input:
OnE, TwO

Output:
----Counts----
Term: one        Count: 7
Term: two        Count: 15