我想要做的是以下内容 - 我有数百个日志文件,我需要搜索并进行一些计数。基本思路是这样,拿一个.txt
文件,读取每一行,如果找到搜索项1,增加搜索项1的计数器,如果找到搜索项2,增加搜索项2的计数器等等on ..例如,如果文件包含类似......
a b c
d e f
g h i
j k h
如果我指定searchables
为e
& 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);
}
答案 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