2010-12-21 14 views
5

私はこれらのパターンは、任意の行に一致した場合、私は、これらの4つのテキストファイルを使用して、このテキストファイルを比較する必要があると私はlinqを使用して2つのテキストファイルを比較しますか?

insert 
update 
delete 
drop 

を持っているこれらのテキストfiles..In pattern.txtを比較するために、4つの文字一つのフォルダ内のファイルとpattern.txtを持っていますそのテキストファイルでは、私は別のログファイルにそれらの行を書く必要があります...私はそれらのファイルを比較し、行番号とテキストファイルに書き込む必要がありますlinqを使用してそれらのファイルを読んでいた..ここに私のコードです

var foldercontent = Directory.GetFiles(pathA) 
        .Select(filename => File.ReadAllText(filename)) 
        .Aggregate(new StringBuilder(), 
        (sb, s) => sb.Append(s).Append(Environment.NewLine), 
        sb => sb.ToString()); 

var pattern = File.ReadAllLines(pathB).Aggregate(new StringBuilder(), 
        (sb, s) => sb.Append(s).Append(Environment.NewLine), 
        sb => sb.ToString()); 

using (var dest = File.AppendText(Path.Combine(_logFolderPath, "log.txt"))) 
      { 
     //dest.WriteLine("LineNo : " + counter.ToString() + " : " + "" + line); 
      } 

編集 #2つのテキストファイルを比較するために、C Iはすでに使用しているが、私はそこに簡単な解決策かもしれませんが、あなたが本当にLINQを使用する場合、これは、少なくとも働いているLINQ

while ((line = file.ReadLine()) != null) 
{ 
if (line.IndexOf(line2, StringComparison.CurrentCultureIgnoreCase) != -1) 
{ 
dest.WriteLine("LineNo : " + counter.ToString() + " : " + " " + line.TrimStart()); 
} 
counter++; 
} 
file.BaseStream.Seek(0, SeekOrigin.Begin); 
counter = 1; 
+0

マッチした線がどのファイルから来たのかを保存する必要がありますか? –

+0

@Matt Ellen:マッチした行を別のテキストファイルに保存する必要があります – bala3569

+0

@ bala3569:はい、ログファイルでは、一致する行がどのファイルから来たのかを保存する必要がありますか? –

答えて

4

でこれを必要とする:

var foldercontent = Directory.GetFiles(pathA) 
        .Select(filename => new 
        { 
         Filename = filename, 
         Lines = File.ReadAllLines(filename) 
        }) 
        .SelectMany(file => file.Lines.Select((line, idx) => new 
        { 
         LineNumber = idx + 1, 
         Text = line, 
         FileName = file.Filename 
        })); 

var pattern = File.ReadAllLines(pathB); 

var result = from fileLine in foldercontent 
      where pattern.Any(p => fileLine.Text.IndexOf(p, StringComparison.CurrentCultureIgnoreCase) != -1) 
      select fileLine; 

foreach (var match in result) 
{ 
    System.Diagnostics.Debug.WriteLine("File: {0} LineNo: {1}: Text: {2}", match.FileName, match.LineNumber, match.Text); 
} 

それともたい場合は、1つのLINQクエリにそれを組み合わせることができます(しかし、私は考えて非常に読みやすいではないthatsの):

var result = from fileLine in (Directory.GetFiles(pathA) 
        .Select(filename => new 
        { 
         Filename = filename, 
         Lines = File.ReadAllLines(filename) 
        }) 
        .SelectMany(file => file.Lines.Select((line, idx) => new 
        { 
         LineNumber = idx + 1, 
         Text = line, 
         FileName = file.Filename 
        }))) 
       where File.ReadAllLines(pathB).Any(p => fileLine.Text.IndexOf(p, StringComparison.CurrentCultureIgnoreCase) != -1) 
       select fileLine; 
+0

もし私がそれを与えるならこれは、n個のマッチがある場合にn回書くことを意味します。var result1 = string.Join( "、"、result.Select(x => x.ToString())。ToArray()); foreach(var match in result) {dest.WriteLine(result1);} – bala3569

+0

私はあなたが意味することを正確に理解していません。私のLINQクエリは、すべてのファイルのすべての一致する行を提供します。線が倍増することはありません。 – Jan

+0

yaそれは正しく与えるが、n回の一致回数でn回だけ書いている。 – bala3569

4

私は、LINQの愛好家だし、それはinappropriaだとき、時々ツールを使用しますので、 te(私はこの状況にgrepやそれに似たものを使うことについて@juharrに同意します)ここにはあなたのためのバージョンがあります。

static IEnumerable<string> CreateMatchesLog(string patternFilePath, string pathToSearch) 
{ 
    string logTemplate = "File {0}, Line: {1}, Pattern: {2}"; 
    DirectoryInfo di = new DirectoryInfo(pathToSearch); 
    var patternlines = File.ReadAllLines(patternFilePath); 
    var fileslines = di.EnumerateFiles().Select(fi => File.ReadAllLines(fi.FullName).Select((line, i) => new {fi.FullName, line, i})); 

    return from filelines in fileslines 
      from pattern in patternlines 
      from fileline in filelines 
      where fileline.line.Contains(pattern) 
      select String.Format(logTemplate, fileline.FullName, fileline.i + 1, pattern); 
} 

次に、この関数の出力をファイルに書きます。

using (StreamWriter sw = new StreamWriter("log.txt", true)) 
{ 
    foreach (var log in CreateMatchesLog("pattern.txt", @"c:\test")) 
    { 
     sw.WriteLine(log); 
    } 
} 

私はあなたがファイルの内容にあなたがプログラムを実行するたびに失いたくないと仮定ので、私は、StreamWritertrueに追加設定しました。

これは非常に非効率的です(そのアスペクトはテストされていません)が、linqとlambdasはwazooを使用しています!

関連する問題