我有一个案例需要比较两个文本文件(使用C#),传入文本文件和现有文本文件,检查更改/差异。两个文本文件具有相同的布局,6列相同类型的数据和列标题。所以这基本上是检查传入文件的内容是否与现有文件相比有任何新数据。
File.ReadAllText
方法实际上做了我想要的,问题是,我只想比较文本文件的前两列中的值,而忽略其他尾随列。
文本文件布局如下所示:
项目#|总计 | C3 | C4 | C5 | C6
123 | 7 | 0 | 0 | 0 | 0
因此,如果第一个文件中的Item#或Total列的更改与第二个文件相比,那么文件的比较应该停在那里,并且应该将其视为文件更改。
有什么简单的方法可以解决这个问题?非常感谢。
答案 0 :(得分:2)
当您使用string.Split
和LINQ的Take
和SequenceEqual
时,这是一个简单的问题。
bool AnyDifferent(string file1FullText, string file2FullText)
{
string[] file1Lines = file1FullText.Split('\n');
string[] file2Lines = file2FullText.Split('\n');
if (file1Lines.Length != file2Lines.Length)
return true;
for (int i = 0; i < file1Lines.Length; i++)
{
var file1LineSplit = file1Lines[i].Split('|');
var file2LineSplit = file2Lines[i].Split('|');
if (!file1LineSplit.Take(2).SequenceEqual(file2LineSplit.Take(2)))
return true;
}
return false;
}
修改或使用File.ReadLines
提高性能(在开始比较之前不必阅读所有文件):
bool AnyDifferent(string file1Path, string file2Path)
{
using (var file1Enumerator = File.ReadLines(file1Path).GetEnumerator())
using (var file2Enumerator = File.ReadLines(file2Path).GetEnumerator())
{
while (true)
{
bool result1 = file1Enumerator.MoveNext();
bool result2 = file2Enumerator.MoveNext();
if (result1 != result2)
return true;
else if (!result1 && !result2)
return false;
var file1LineSplit = file1Enumerator.Current.Split('|');
var file2LineSplit = file2Enumerator.Current.Split('|');
if (!file1LineSplit.Take(2).SequenceEqual(file2LineSplit.Take(2)))
return true;
}
}
}
答案 1 :(得分:0)
我会为每个项目创建一个类:
class Item
{
public int ItemNumber { get; set; }
public int Total { get; set; }
}
然后使用列表并比较数据
List<Item> items = new List<Item>();
foreach (String line in File.ReadAllLines("filepath"))
{
Item item = new Item
{
ItemNumber = Convert.ToInt32(line.Split('|')[0]),
Total = Convert.ToInt32(line.Split('|')[1])
};
}
然后你有一个坚实的结构来与
进行比较