C# を使用してテキスト ファイル (ログ ファイル) を検索し、検索キーワードを含む行番号と完全な行を表示するには、ヘルプが必要です。
4 に答える
これはhttp://msdn.microsoft.com/en-us/library/aa287535%28VS.71%29.aspxからのわずかな変更です。
int counter = 0;
string line;
// Read the file and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("c:\\test.txt");
while((line = file.ReadLine()) != null)
{
if ( line.Contains("word") )
{
Console.WriteLine (counter.ToString() + ": " + line);
}
counter++;
}
file.Close();
これについてはゲームに少し遅れましたが、この投稿に出くわしたので、別の回答を追加すると思いました。
foreach (var match in File.ReadLines(@"c:\LogFile.txt")
.Select((text, index) => new { text, lineNumber = index+ 1 })
.Where(x => x.text.Contains("SEARCHWORD")))
{
Console.WriteLine("{0}: {1}", match.lineNumber, match.text);
}
これは以下を使用します。
File.ReadLinesは、 の必要性をなくします。
StreamReader
また、LINQ のWhere
句とうまく連携して、ファイルからフィルター処理された一連の行を返します。各要素のインデックスを返すEnumerable.Selectのオーバーロード。これに 1 を追加して、一致する行の行番号を取得できます。
サンプル入力:
just a sample line
another sample line
first matching SEARCHWORD line
not a match
...here's aSEARCHWORDmatch
SEARCHWORD123
asdfasdfasdf
出力:
3: first matching SEARCHWORD line
5: ...here's aSEARCHWORDmatch
6: SEARCHWORD123
悲観論者が書いたように、Excel にエクスポートするには、CSV ファイル形式を使用できます。何を書けばよいかわからない場合は、MS Excel にデータを入力してみて、メニューの [名前を付けて保存] オプションをクリックし、ファイル タイプとして CSV を選択してください。
一部の言語では、値を区切るためのデフォルトがコンマではないため、CSV ファイル形式を作成するときは注意してください。たとえば、ブラジルのポルトガル語では、デフォルトは、小数点記号としてのコンマ、千単位の区切り記号としてのドット、および値を区切るためのセミコロンです。それを書くときは文化に注意してください。
もう 1 つの方法は、水平タブをセパレータとして使用することです。文字列を書き込んでみてください。TAB キーを押してから別の文字列を押して、Microsoft Excel に貼り付けます。そのプログラムのデフォルトの区切り記号です。
特定の問題に対してその場しのぎの解決策を使用している場合は、どちらの代替案もあまり考えずに使用できます。他の人 (または他の環境) が使用するものをプログラミングしている場合は、文化固有の違いに注意してください。
ああ、今思い出したのですが、XML を使用してスプレッドシートを作成できます。それは .NET パッケージだけで実行できます。私は何年も前にC#.NET 2.0でそれをしました
特定の検索用語を含み、他の用語を除外して、特定のファイル タイプを探すディレクトリのリストを検索する必要があるという要件がありました。
たとえば、C:\DEV を調べて、"WriteLine" と "Readline" という用語を含み、"hello" という用語を含まない .cs ファイルのみを見つけたいとします。
これを行うための小さな c# ユーティリティを作成することにしました。
これはあなたがそれを呼び出す方法です:
class Program
{
//Syntax:
//FileSearch <Directory> EXT <ext1> <ext2> LIKE <TERM1> <TERM2> NOT <TERM3> <TERM4>
//Example:
//Search for all files recursively in C:\Dev with an extension of cs that contain either "WriteLine" or "Readline" but not "hello"
//FileSearch C:\DEV EXT .cs LIKE "WriteLine" "ReadLine" NOT "hello"
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("FileSearch <Directory> EXT <EXT1> LIKE <TERM1> <TERM2> NOT <TERM3> <TERM4>");
return;
}
Search s = new Search(args);
s.DoSearch();
}
}
これは実装です:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
class Hit
{
public string File { get; set; }
public int LineNo { get; set; }
public int Pos { get; set; }
public string Line { get; set; }
public string SearchTerm { get; set; }
public void Print()
{
Console.WriteLine(File);
Console.Write("(" + LineNo + "," + Pos + ") ");
Console.WriteLine(Line);
}
}
class Search
{
string rootDir;
List<string> likeTerms;
List<string> notTerms;
List<string> extensions;
List<Hit> hitList = new List<Hit>();
//FileSearch <Directory> EXT .CS LIKE "TERM1" "TERM2" NOT "TERM3" "TERM4"
public Search(string[] args)
{
this.rootDir = args[0];
this.extensions = ParseTerms("EXT", "LIKE", args);
this.likeTerms = ParseTerms("LIKE", "NOT", args);
this.notTerms = ParseTerms("NOT", "", args);
Print();
}
public void Print()
{
Console.WriteLine("Search Dir:" + rootDir);
Console.WriteLine("Extensions:");
foreach (string s in extensions)
Console.WriteLine(s);
Console.WriteLine("Like Terms:");
foreach (string s in likeTerms)
Console.WriteLine(s);
Console.WriteLine("Not Terms:");
foreach (string s in notTerms)
Console.WriteLine(s);
}
private List<string> ParseTerms(string keyword, string stopword, string[] args)
{
List<string> list = new List<string>();
bool collect = false;
foreach (string arg in args)
{
string argu = arg.ToUpper();
if (argu == stopword)
break;
if (argu == keyword)
{
collect = true;
continue;
}
if(collect)
list.Add(arg);
}
return list;
}
private void SearchDir(string dir)
{
foreach (string file in Directory.GetFiles(dir, "*.*"))
{
string extension = Path.GetExtension(file);
if (extension != null && extensions.Contains(extension))
SearchFile(file);
}
foreach (string subdir in Directory.GetDirectories(dir))
SearchDir(subdir);
}
private void SearchFile(string file)
{
using (StreamReader sr = new StreamReader(file))
{
int lineNo = 0;
while (!sr.EndOfStream)
{
int pos = 0;
string term = "";
string line = sr.ReadLine();
lineNo++;
//Look through each likeTerm
foreach(string likeTerm in likeTerms)
{
pos = line.IndexOf(likeTerm, StringComparison.OrdinalIgnoreCase);
if (pos >= 0)
{
term = likeTerm;
break;
}
}
//If found make sure not in the not term
if (pos >= 0)
{
bool notTermFound = false;
//Look through each not Term
foreach (string notTerm in notTerms)
{
if (line.IndexOf(notTerm, StringComparison.OrdinalIgnoreCase) >= 0)
{
notTermFound = true;
break;
}
}
//If not term not found finally add to hitList
if (!notTermFound)
{
Hit hit = new Hit();
hit.File = file;
hit.LineNo = lineNo;
hit.Pos = pos;
hit.Line = line;
hit.SearchTerm = term;
hitList.Add(hit);
}
}
}
}
}
public void DoSearch()
{
SearchDir(rootDir);
foreach (Hit hit in hitList)
{
hit.Print();
}
}
}