0

我有一个案例,我需要比较两个文本文件(使用 C#)、一个传入的文本文件和一个现有的文本文件,以检查更改/差异。两个文本文件具有相同的布局,6 列相同类型的数据和列标题。所以这基本上是检查传入文件的内容与现有文件相比是否有任何新数据。

File.ReadAllText方法基本上可以满足我的要求,但问题是,我只想比较文本文件前两列中的值,而忽略其他尾随列。

文本文件布局如下:

项目编号|总计|C3|C4|C5|C6

123|7 |0|0|0|0

因此,如果第一个文件中的 Item # 或 Total 列与第二个文件相比发生了变化,则文件的比较应该停在那里,它应该被视为文件更改。

解决此问题的简单方法是什么?非常感谢。

4

2 回答 2

2

当您使用string.SplitLINQTakeSequenceEqual.

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;
        }
    }
}
于 2013-08-26T13:48:21.587 回答
0

我会为每个 Item 创建一个类:

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])
    };
}

那么你有一个坚实的结构来比较它们

于 2013-08-26T13:48:39.907 回答