私は2つのテキストファイルa.txt
とb.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);
あなたのコードは、基本的に2つのファイルの間で同期している行番号に依存しています。これはかなり前提です。あなたはユニットがあなたが比較しているものを明確にする必要があります - ライン?文字?また、各ファイル項目のどこにファイルを追加したり削除したりすることができますか?また、特定のユニットの2つの発生は、1つまたは2つのものとして扱われますか?それは些細なことではありません! – peterG
Diffingファイルはオープンエンドで非常に難しい問題ですが、過去に解決されています。私はあなたがそれを再実装するのではなく、既存のライブラリを使うことを提案します(これは学問的な演習でない限り)。たとえば、DiffPlex:https://github.com/mmanela/diffplex – Dai
あなたは車輪を再発明しています。どうして?あなたが本当にそれを再実装しようとするなら、 'diff'ユーティリティで使用されるMyersアルゴリズムのような確立されたアルゴリズムを探してください:https://en.wikipedia.org/wiki/Diff_utility#Algorithm – STW