たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【C#】ファイルを2つ読み込み、中身の突き合わせを行う

C#で、2つのファイルを読み込んで、その2つのファイルの中身を突き合わせる処理を書きました。その時の勉強メモです。

やりたいこと

File1 : エラーメッセージの一覧(各行に1エラーメッセージ)
File2 : エラーメッセージの切り分けを行うために、正規表現で書いた条件の一覧(各行に1条件)

今回は、File1とFile2を読み込み、File1にかかれている各メッセージ内容がFile2のどの条件に該当するかを調べます。

Fileの読み込み

using (StreamReader file = new StreamReader(@"D:\CSharp\xxx\txt\errmessage.txt", System.Text.Encoding.UTF8))
using (StreamReader file2 = new StreamReader(@"D:\CSharp\xxx\txt\kiriwake.txt", System.Text.Encoding.UTF8))
{
    xxxxxxxxxxx
}

ファイルを読み込む際に、usingステートメントを使用することで、処理が終わったときにDispose()を書かなくても、リソースの開放を勝手にやってくれます。2つ以上のファイルを読み込みたいときは、上記の用に順番に書いていきます。

File内の行の読み込み

string errMessage = "";
List<string> errMessages = new List<string>();
while ((errMessage = file.ReadLine()) != null)
{
    errMessages.Add(errMessage);
}

file.ReadLine()を使用して、ファイルの各行をnullになるまで読み込んでいます。その読み込んだ文字列をerrMessage に格納しています。List 型のerrMessagesにその読み込んだ文字列をAddしています。つまり、errMessagesに読み込んだファイルの内容が格納されます。これをkiriwake分も行うことで読み込み完了です。

 for (int i = 0; i < errMessages.Count; i++)
  for (int j = 0; j < kiriwakes.Count; j++)

あとはエラーメッセージの各行と切り分けの各行をチェックして正規表現に該当するようであれば何かしらの出力をして完了です。

Regex.IsMatch(err kiri)

今回は切り分けには正規表現を使用しているので、エラーメッセージが正規表現に該当するか確認するには上記のようにRegexクラスのIsMatchメソッドを使用します。第一引数(err)がチェックしたい文字列で、第二引数(kiri)が切り分けの条件を入れます


例ですが、errとkiriが下記の値を取るとしましょう。

err = Error Test Messages
kiri = .*Test.*

この2つをIsMatchで処理すると、trueになります。この様にして、すべてのエラーメッセージとすべての切り分けを比較することでエラーメッセージがどの切り分けに該当しているのか確認することができます。ただ、forをネストしてしまうと計算量が多くなり(n^2)、大量のメッセージor切り分けの処理に時間がかかってしまいます。