我试图比较两个Csv文件,每个文件中有1200万条记录,在比较文件之前,我想按升序排序,然后比较它们。我已经尝试了下面的代码,但它给出了内存不足异常。
public void SortCsv(string originalPath1, string originalPath2)
{
var lines1 = File.ReadLines(originalPath1, Encoding.Default);
var sorted1 = lines1.Skip(1).OrderBy(row => row).Select(row => row).ToList();
var lines2 = File.ReadLines(originalPath2, Encoding.Default);
var sorted2 = lines2.Skip(1).OrderBy(row => row).Select(row => row).ToList();
var extraFiles1Csv = sorted1.Except(sorted2, StringComparer.CurrentCultureIgnoreCase);
var extraFiles2Csv = sorted2.Except(sorted1, StringComparer.CurrentCultureIgnoreCase);
if(extraFiles1Csv.Count() > 0)
foreach (var item in extraFiles1Csv)
Console.WriteLine(item);
if (extraFiles1Csv.Count() > 0)
foreach (var item in extraFiles2Csv)
Console.WriteLine(item);
Console.WriteLine("Record is matched");
Console.ReadKey();
}
我期待它应该排序两个csv文件的数据,并比较他们,如果有任何不匹配,那么它应该返回不匹配的记录,否则它应该打印匹配的文件。
1条答案
按热度按时间o2g1uqev1#
通过像这样使用linesX和sortedX,您可以将每个文件保存在内存2ce中,我认为您可以删除select
将其合并将使内存使用量减半
此外,我会看看一些csv nuget包,如Sylvan.Data.csv来读取你的文件,这些包通常比你自己做的速度和内存处理要快。))