【问题标题】:Alternative to Binary Search for searching a million record CSV in C#?在 C# 中搜索一百万条记录 CSV 的二进制搜索的替代方法?
【发布时间】:2014-04-04 08:20:50
【问题描述】:

我有一个包含数百万条记录的 csv 文件,其中包含一个 ID 列、日期列等。我让你从输入文件中读取每条记录,比如 file1 n 放入一个列表中,在插入时我需要检查该特定 ID如果是,则列表中已经存在,然后将日期替换为 file1 中的新日期。

这可以通过二进制搜索 (List.BinarySearch)(C#) 来完成。但是由于文件很大,我认为这将是一个乏味的过程。有什么替代方法。我怎样才能有效地做到这一点

谢谢

【问题讨论】:

    标签: c# list csv binary-search string-hashing


    【解决方案1】:

    将它们添加到HashSet<T>

    HashSet 进行高效搜索并覆盖重复项,这正是您想要的。
    您将需要manage the Equality 您的物品。

    【讨论】:

      【解决方案2】:

      您可以维护一个Dictionary<TKey, TValue>,其中TKey 是存储在ID 列中的值的类型,TValue 是特定记录的类型(您可以定义一个包含字段的类, 一个对应于 csv 中的每一列)。

      然后只需将新记录分配给字典,针对它所属的ID 键。 这样,您可以确保字典中的所有键都有更新的记录(也包括这些中的 DateTime)。确实,它也很省时。

      这是一个示例代码:

      public class Record // this class represents a particular record in the csv
      {
          public int ID { get; set; }
          public DateTime DateTime { get; set; }
          // other columns like above
      }
      

      然后在客户端代码中:

      Dictionary<int, Record> dictionaryIdRecord = new Dictionary<int, Record>();
      
      // `records` is the List of <Record>s in the csv
      foreach (Record record in records)
      {
          dictionaryIdRecord[record.ID] = record;
      }
      

      【讨论】:

        【解决方案3】:

        您是否考虑过将此列表导入数据库表并通过 SQL 查询执行所述过滤? 从我看到的地方来看,查询可能不会很复杂,对所有字段进行分组并选择max(yourdate) 肯定是一个很好的开始。 但我不知道数据库是否是这个任务的一个选项?

        【讨论】:

        • 不,数据库没有选项。 :(
        猜你喜欢
        • 2021-03-15
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        • 2011-08-18
        • 2020-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多