2016-11-02 42 views
-1

私は2つのテキストファイルa.txtb.txtを比較しようとしています。
a.txtは昨日の結果です。
b.txtが現在の結果です。
トリッキーなことは、「b.txt」に「a.txt」と比較して「b.txt」に何か新しいものが追加されている可能性があることがわかっています。これらの新しいオブジェクトは除外す​​る必要があります。
2つのファイルが順序付けられていないので、 'a.txt'のインデックス1にあるものは 'b.txt'のインデックス2になります。私は "mano - mathiasrønnownørtoft"のような文字列を比較しています。
私が試したのは、新しいオブジェクトを表示するだけでした。.txtファイルを比較して差分を取得する

string[] File1Lines = File.ReadAllLines(path); 
string[] File2Lines = File.ReadAllLines(newPath); 
List<string> NewLines = new List<string>(); 

for (int lineNo = 0; lineNo<File1Lines.Length; lineNo++) 
    { 
    if (!String.IsNullOrEmpty(File1Lines[lineNo]) && !String.IsNullOrEmpty(File2Lines[lineNo])) 
    { 
     if(String.Compare(File1Lines[lineNo], File2Lines[lineNo]) != 0) 
     NewLines.Add(File2Lines[lineNo]) ; 
    } 
    else if (!String.IsNullOrEmpty(File1Lines[lineNo])) 
    { 
    } 
    else 
    { 
     NewLines.Add(File2Lines[lineNo]); 
    } 
    } 
    if (NewLines.Count > 0) 
    { 
    File.WriteAllLines(resultpath, NewLines); 
    } 

これはちょうど私にマージされたファイルを与える:私が試した何
。私は自分自身を正しく説明してくれたと思っています。

これを試してみると、なぜ機能しないのですか?何も表示しません。

 List<string> a = File.ReadAllLines(path).ToList(); 
     List<string> b = File.ReadAllLines(newPath).ToList(); 

     List<string> copy = new List<string>(a); 

     foreach (string s in copy) 
     { 
      if (b.Contains(s)) 
      { 
       a.Remove(s); 

      } 
      else 
      { 
       continue; 
      } 
     } 
     myWriter.WriteLine(a); 
+4

あなたのコードは、基本的に2つのファイルの間で同期している行番号に依存しています。これはかなり前提です。あなたはユニットがあなたが比較しているものを明確にする必要があります - ライン?文字?また、各ファイル項目のどこにファイルを追加したり削除したりすることができますか?また、特定のユニットの2つの発生は、1つまたは2つのものとして扱われますか?それは些細なことではありません! – peterG

+3

Diffingファイルはオープンエンドで非常に難しい問題ですが、過去に解決されています。私はあなたがそれを再実装するのではなく、既存のライブラリを使うことを提案します(これは学問的な演習でない限り)。たとえば、DiffPlex:https://github.com/mmanela/diffplex – Dai

+1

あなたは車輪を再発明しています。どうして?あなたが本当にそれを再実装しようとするなら、 'diff'ユーティリティで使用されるMyersアルゴリズムのような確立されたアルゴリズムを探してください:https://en.wikipedia.org/wiki/Diff_utility#Algorithm – STW

答えて

1

これは実際にはdiffがどれくらい正確で、どのくらい速くしたいかによって決まります。

簡単に実装するには、AとBのすべての行を取得し、Aに行を追加します(Bにその行が含まれている場合は、AとBの両方から行を削除します)。残されているのは、Aの行で、Bの行ではない、またはその逆の行です。この方法は、考慮に注文なりません

注ので、

Log 1 
C 
B 
A 

Log 2 
A 
B 
C 

は同一とみなされます。

List<string> A; 
List<string> B; 

List<string> aCopy = new List(A); 

foreach(string s in aCopy) 
{ 
    if (B.Contains(s)) 
    { 
     A.Remove(s); 
     B.Remove(s); 
    } 
} 

//Whats in A are whats missing in B 
//Whats in B are whats missing in A 
+0

これはちょうど私がスティーブが必要なものです、私に例を与えてもらえますか? –

+1

@MathiasRønnowNørtoftコードはテストされていません。ちょうどアイデアを表示する – Steve

+0

スティーブもう一つの賛成、ive私の質問を編集しました。なぜそれが動作しないの任意のアイデア? –

1

あなたは、このコマンドは、繰り返し文字列を\ n一致ソート、参加して、正規表現のコマンドで

using System; 

    using System.Text; 


    using System.Text.RegularExpressions; 

    class Program 


{ 

static void Main() 

{ 

    string strFile4xf = File.ReadAllText(@"a.txt"); 

    strFile4xf = Regex.Replace( strFile4xf,  @"(.*?)\r", "$1a\r"); 
    File.WriteAllText(@"a1.txt", strFile4xf); 



    string strFile4xe = File.ReadAllText(@"b.txt"); 

     strFile4xe = Regex.Replace( strFile4xe,  @"(.*?)\r", "$1b\r"); 
    File.WriteAllText(@"b1.txt", strFile4xe); 





     string s4 = File.ReadAllText(@"a1.txt"); 

    string s2 = File.ReadAllText(@"b1.txt"); 

    string sn = string.Concat(s4, s2); 

    File.WriteAllText(@"join.txt", sn); 

    var contents = File.ReadAllLines("join.txt"); 
     Array.Sort(contents); 
    File.WriteAllLines("join.txt", contents); 

    string strFile4x = File.ReadAllText(@"join.txt"); 

    strFile4x = Regex.Replace( strFile4x,  @"\n(.*?)a\r\n\1b\r", ""); 
    File.WriteAllText(@"removeequal.txt", strFile4x); 




    var contents2 = File.ReadAllLines("removeequal.txt"); 
     Array.Sort(contents2); 
    File.WriteAllLines("removeequal.txt", contents2); 




string strFile4x2 = File.ReadAllText(@"removeequal.txt"); 

strFile4x2 = Regex.Replace( strFile4x,  @"\n\r", ""); 
File.WriteAllText(@"blanklines.txt", strFile4x2); 


    } 
    } 

を平等文字列を削除することができます(。*?)\ rを\ nは\ 1 \ rをこれはソートされています

+0

これは動作しますが、iveは1つのエラーを受けました。私はちょうど同じテキストとそれらの両方にある1つの文字列を持つことを試みました。 "blanklines.txt"には二度言及されています。テキストは100行に似ていますので、1行だけでエラーになります。 –

+0

私は問題が何であるかをよく理解していません それをよりよく説明できますか? (あなたの質問の中で) – jhonny625

+0

このコマンドは、等しい行だけを削除します\ n(。*?)\ r \ n \ 1 \ r – jhonny625

関連する問題