【问题标题】: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
【解决方案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) 肯定是一个很好的开始。
但我不知道数据库是否是这个任务的一个选项?