c# - 順不同のログファイルでの検索

c# regex search

私が作業している場所には、次のような行を含むログファイルがあります。


31201007061308000000161639030001


これは次のように読まれます:


31 |年(4)|月(4)|日(2)|時間(2)|分(2)| 000000 |施設(3)|バッジ(5)| 0001


したがって、各レコードに行があるはずですが、次のようなことが起こります。

31201007192000000000161206930004
31201007192001000000161353900004
31201031201007192004000000161204690004
31201007192004000000090140470004
31201007192005000000090148140004
3120100719200500031201007191515000000161597180001
31201007191700000000161203490001
31201007191700000000161203490001
31201007191700000000161202830001
31201007191700000000

That's because the software that's supposed to read the file, sometimes it misses some of the newests records and the guy in charge copies the older records to the end of the file. So basically it's like that because of human mistakes.

When a record isn't saved in the DB I have to search the file. At first I did just a cicle that went through every record on the file, but it's really slow and the problems mentioned above made it slower. The approach I have right now is with a Regular Expression and it's like this:

//Starts Reader
StreamReader reader = new StreamReader(path);
string fileLine = reader.ReadLine();
while (!reader.EndOfStream)
{
  //Regex Matcher
  Regex rx = new Regex(@"31\d\d\d\d\d\d\d\d\d\d\d\d000000161\d\d\d\d\d0001");

  //Looks for all valid lines
  MatchCollection matches = rx.Matches(fileLine);

  //Compares each match against what we are looking for
  foreach (Match m in matches)
  {
    string s = m.Value;
    compareLine(date, badge, s);
  }

  reader.ReadLine();
}
reader.Close(); //Closes reader


私の質問はこれです:ファイルを検索する良い方法は何ですか?最初に注文/クリーニングする必要がありますか?
答え
次の手順を実行することをお勧めします。


各行をオブジェクトに解析します。これらの行には、構造体が適切である必要があります。 DateTimeオブジェクトとその他の関連フィールドを含めます。少しクリーンアップすれば、これはRegexで簡単に行うことができます。キャプチャグループとリピーターを使用します。 1年間、(\d{4})の代わりに\d\d\d\dを使用すると、4つの数値を連続して取得できます。
各行をオブジェクトとして保持するList<MyStruct>を作成します。
LINQを使用してリストを検索します。次に例を示します。

var searchResults = from eachEntry in MyList
                    where eachEntry.Date > DateTime.Now
                    and eachEntry.facility.Contains("003")
                    select eachEntry;

Also, add this line to your Regex, it will speed it up, if only by a few milliseconds:

MatchCollection matches = rx.Matches(fileLine, RegexOptions.Compiled);
関連記事

c# - TabControlでの画像の配置に関する問題

c# - このクラスを一般的なクラスに変えることは可能ですか?

c# - 端末(Windows-CE)が5分後にシャットダウンしないようにする方法

c# - 要素の1つを取得、変更、保存できるようにするために、関連する値のリストを保存するために使用する必要があるもの

c# - エンタープライズライブラリdbcommand AddInParameterメソッド

c# - RIAデータサービスの呼び出しをサービスレイヤーにリファクタリングするにはどうすればよいですか?

c# - MoqでHttpApplicationStateをモックするときにオブジェクトを設定できないようです

c# - ラインオブジェクトのエンドキャップの幅または高さの値を取得するにはどうすればよいですか?

c# - データベースにアクセスしてエンティティフレームワークデータをテストする

c# - LoadAsyncとMemoryStreamを使用して、データベースから画像ボックスに画像をロードしたい