在C#中比较两个csv文件

时间:2011-03-01 12:15:10

标签: c#

我需要以编程方式找出两个csv文件之间的区别。 有没有办法在不使用任何循环的情况下找出差异?

请帮帮我。

4 个答案:

答案 0 :(得分:3)

您需要多少关于差异的信息?如果您需要的只是它们不同并且没有循环的要求得到修复,您可以尝试获取MD5哈希值并比较两个哈希值。如果您不关心内存使用情况,可以将整个流转储到MemoryStream调用Getbytes,然后将两个数组传递到Enumerable.SequenceEqual

private static byte[] GetFileHash(string filename)
{
    using(var stream = new FileStream(filename, FileMode.Open))
    {
        var md5Hasher = new MD5CryptoServiceProvider();
        return md5Hasher.ComputeHash(stream);
    }
}

var file1hash = GetFileHash("file1.ext");
var file2hash = GetFileHash("file2.ext");

var areEqual = Enumerable.SequenceEqual(file1hash, file2hash);

现在有使用循环,而不是你。

答案 1 :(得分:2)

您是否看过以下链接?
如果没有,那么你应该。

答案 2 :(得分:0)

不,没有使用循环是没有办法的。您如何期望任何比较算法迭代文件的字符/单词/标记/行而不使用循环?

无论如何,假设两个CSV都按ID列排序:

  • 尝试将文件拆分为行
  • 在循环中
    • 将每一行拆分为List<string>或数组
    • 比较两个文件的列表(忽略尾随空列等)。
    • 找到数据列的差异时将包含差异的新行保存到List<List<string>>
    • 当找到不同的ID时,比较两个ID:使用较小的ID保存行(标识附加行)并获取此文件的下一行

答案 3 :(得分:0)

检查下面的代码以CompareTwoCSVFile并在另一个.csv文件中进行报告

class CompareTwoCSVFile
{

    public  bool ReportErrorOnCompareCSV(string filePathOne, string filePathTwo)
    {
        var csv = new StringBuilder();
        string[] fileContentsOne = File.ReadAllLines(filePathOne);
        string[] fileContentsTwo = File.ReadAllLines(filePathTwo);

        if (!fileContentsOne.Length.Equals(fileContentsTwo.Length))
            return false;

        string[] columnshead1 = fileContentsOne[0].Split(new char[] { ';' });
        List<string> heading1 = new List<string>();
        Dictionary<string, string>[] dict1 = new Dictionary<string, string>[fileContentsOne.Length];
        Dictionary<string, string>[] dict2 = new Dictionary<string, string>[fileContentsTwo.Length];
        string[] headingsplit = columnshead1[0].Split(',');
        for (int i=0;i< headingsplit.Length;i++)
        {
            heading1.Add(headingsplit[i]);
        }

        var newLine = "";
        newLine = string.Format("{0},{1},{2},{3}", "File1_ColumnName", "File1_ColumnValue", "File2_ColumnName", "File2_ColumnValue");
        csv.AppendLine(newLine);

        for (int i = 0; i < fileContentsOne.Length-1; ++i)
        {
                string[] columnsOne = fileContentsOne[i+1].Split(new char[] { ';' });
                string[] columnsTwo = fileContentsTwo[i+1].Split(new char[] { ';' });

                string[] cellOne = columnsOne[0].Split(',');
                string[] cellTwo = columnsTwo[0].Split(',');
                dict1[i] = new Dictionary<string, string>();
                dict2[i] = new Dictionary<string, string>();
                for(int j=0;j< headingsplit.Length;j++)
                {
                    dict1[i].Add(heading1[j],cellOne[j]);
                }
                for (int j = 0; j < headingsplit.Length; j++)
                {
                    dict2[i].Add(heading1[j], cellTwo[j]);
                }
                foreach (KeyValuePair<string, string> entry in dict1[i])
                {
                   if (dict2[i][entry.Key].Equals(entry.Value)!=true)
                   {
                       Console.WriteLine("Mismatch Values on row "+i+":\n File1 "+entry.Key + "-" + entry.Value+"\n File2 "+entry.Key+"-"+ dict2[i][entry.Key]);
                    newLine = string.Format("{0},{1},{2},{3}", entry.Key, entry.Value, entry.Key, dict2[i][entry.Key]);
                    csv.AppendLine(newLine);
                   }
               }
            }
            File.WriteAllText("D:\\Errorlist.csv", csv.ToString());
            return true;
    }

}