2010-11-18 5 views
2

私は主な機能がユーザにログテキストファイルから行/列をgrepさ​​せるはずのC#コンソールプログラムを持っています。C#プログラミングテキストファイルから列/行をグレープする方法は?

テキストファイル内の例で、特定の日付などから関連するすべての行のグループをグレープしたい場合 "Tue Aug 03 2004 22:58:34" to "Wed Aug 04 2004 00:56: 48 "。したがって、処理後、プログラムは2つの日付の間にログテキストファイル内にあるすべてのデータを出力します。

grepやファイルから必要なテキスト/データを取得するためのフィルタを作成するために使用できるコードについてアドバイスしてもらえますか?ありがとう!

C#プログラムファイル:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 

namespace Testing 
{ 
class Analysis 
{ 
    static void Main() 
    { 
     // Read the file lines into a string array. 
     string[] lines = System.IO.File.ReadAllLines(@"C:\Test\ntfs.txt"); 

     System.Console.WriteLine("Analyzing ntfs.txt:"); 

     foreach (string line in lines) 
     { 
      Console.WriteLine("\t" + line); 

      // ***Trying to filter/grep out dates, file size, etc**** 
      if (lines = "Sun Nov 19 2000") 
      { 
       Console.WriteLine("Print entire line"); 
      } 
     } 

     // Keep the console window open in debug mode. 
     Console.WriteLine("Press any key to exit."); 
     System.Console.ReadKey(); 
    } 
} 
} 

ログのテキストファイルの例:あなたがstring.Containsができますより豊かな方法で一致した行を選択するために、Regexを使ってこれを行うことが

Wed Jul 21 2004 16:58:48 499712 m... r/rrwxrwxrwx 0  0  8360-128-3 
C:/Program Files/AccessData/Common Files/AccessData LicenseManager/LicenseManager.exe 

Tue Aug 03 2004 22:58:34 23040 m... r/rrwxrwxrwx 0  0  8522-128-3 
C:/System Volume Information/_restore{88D7369F-4F7E-44D4-8CD1- 
F7FF1F6AC067}/RP4/A0002101.sys 

23040 m... r/rrwxrwxrwx 0  0  9132-128-3 
C:/WINDOWS/system32/ReinstallBackups/0003/DriverFiles/i386/mouclass.sys 

23040 m... r/rrwxrwxrwx 0  0  9135-128-4 C:/System Volume 
Information/_restore{88D7369F-4F7E-44D4-8CD1-F7FF1F6AC067}/RP4/A0003123.sys 

23040 m... r/rrwxrwxrwx 0  0  9136-128-3 
C:/WINDOWS/system32/drivers/mouclass.sys 

Tue Aug 03 2004 23:01:16 196864 m... r/rrwxrwxrwx 0  0  4706-128-3 
C:/WINDOWS/system32/drivers/rdpdr.sys 

Tue Aug 03 2004 23:08:18 24960 m... r/rrwxrwxrwx 0  0  8690-128-3 
C:/WINDOWS/system32/drivers/hidparse.sys 

答えて

2

さて、具体的な例のための応急処置として:

if (line.StartsWith("Sun Nov 19 2000")) 
{ 
    Console.WriteLine(line); 
} 

あなたは、ライン内の部分文字列を検索しContainsを使用することができます。

ファイル全体を配列にロードすることは、非常に大きなログに対してはうまく調整できないことに注意してください。私たちは、それはあなたのための問題だ場合、その固定に見ることができます - しかし、のは、ゆっくりと物事を見てみましょう:)

+0

「StartsWith」は最初だけを読みますか?いくつかの行は、複数のプロセスが同時に発生しているフォームとして日付で始まらないためです。ありがとう。 – JavaNoob

+0

@JavaNoob:はい、 "StartsWith"は行の先頭だけをチェックするので、 "Contains"とも言われています。あなたの複数のプロセスがログファイルを破損していると思われますが、別の問題として。 –

+0

複数のプロセスが正しく使用されるのは、ログがMACtimesの用途として使用されるためです。上記の私の質問のログセクションを編集しましたので、一度ご覧ください。ありがとう。 – JavaNoob

4

findstr.exeなぜ再導入するのかわかりません。あなたはFile.ReadLines(.NET 4のみ)を見つけるかもしれない大きなファイルの場合

は、優れた性能 - これは、同じ行を読み取りますが、あなたは一度RAMにファイル全体をロードせずにforeachおよびその他のIEnumerableシナリオでそれらを処理することができます。

+0

担当者まで!ありがとう! – JavaNoob

1

は、ここで私はテストで使用grepのスタイルの方法です:ReadLinesのアイデアのための

public static List<string> FileGrep(string filePath, string searchText) 
    { 
     var matches = new List<string>(); 

     using (var f = File.OpenRead(filePath)) 
     { 
      var s = new StreamReader(f); 

      while (!s.EndOfStream) 
      { 
       var line = s.ReadLine(); 

       if (line != null && line.Contains(searchText)) matches.Add(line); 
      } 

      f.Close(); 
     } 

     return matches; 
    } 
関連する問題