我需要以编程方式找出两个csv文件之间的区别。 有没有办法在不使用任何循环的情况下找出差异?
请帮帮我。
答案 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>>
答案 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;
}
}