【问题标题】:Comparing two large CSV files to remove identical lines/records比较两个大型 CSV 文件以删除相同的行/记录
【发布时间】:2016-04-02 01:16:32
【问题描述】:

我在这里需要比较两个大小为 4 GB 且有超过 1000 万条记录的大型 CSV 文件,以从新 CSV 文件中获取记录,而忽略旧 CSV 文件中的记录,我无法将这些文件加载​​到一个 DT 或 LIST 并进行比较以找到相同的记录并删除它们,因为它会给我 System.OutofMemory Exception,所以我尝试了另一种方法,为中的每一行生成 HashCode CSV 并为每个文件形成两个列表,然后比较两个列表并确定两个文件之间的差异。

实际问题:

我知道 getashcode() 方法没有足够的信息来取回转换为哈希码的原始字符串,所以我需要一些其他方法来生成哈希码并取回实际的字符串值从哈希值。

以下是我使用的代码。

生成列表

private List<int> ListgetHashValue(string file)
        {
            try
            {                
                List<int>HashList = new List<int>();                                                                        
                    StreamReader reader = new StreamReader(file);
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {                       
                        HashList.Add(line.GetHashCode());
                    }                
                return HashList;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

比较列表

List<int> result =  NewFile.Except(OldFile).ToList();

获取不在新文件列表和旧文件列表中的记录

【问题讨论】:

  • 行的顺序是否相同?区分大小写?
  • 您可以将行号存储在字典中,以哈希码为键,然后稍后再次读取该行
  • 我想这是你要做一次的事情。您可以使用临时数据库来存储这两个文件中的行以及哈希码,然后查询以获得您想要的内容(比较哈希码)。
  • @GaneshR。不需要区分大小写或订单标准。实际上,我尝试通过使用具有哈希码和索引(行 id)的 list 数组添加索引,但 这就像遍历整个文件 以获取我在 比较列表。还有其他方法可以提高效率吗?
  • @ShanShan 它是一个每周重复的过程。这个过程将每周重复一次。你的想法听起来不错,但我从未想过使用 BackEnd 来实现结果。我试一试。

标签: c# csv compare


【解决方案1】:

我建议将文件分解为多个文件并通过线程异步处理它们,但为此您需要根据某些参数对文件进行排序,因为比较应该仅限于该文件,然后可以将它们全部合并。

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2017-02-01
    • 2014-08-08
    相关资源
    最近更新 更多