我必须比较可能包含超过100000个条目的csv文件中的条目,并查找对并将它们存储在另一个文件中。 比较必须检查两列或更多列中的值,例如:
狗5
Cats 7
小鼠5
狗3
狗5
在这个例子中,我必须拿起{Dogs,5}对并忽略其余部分。 你会建议采用什么方法?
像往常一样感谢
答案 0 :(得分:2)
如果您的架构真的很简单,可以使用Tuple
和HashSet<T>
以最少量的代码完成。
在任何情况下,基本策略都是创建一个数据结构来跟踪您所看到的内容并使用它来确定要输出的内容。也可以使用字典跟踪计数。但是,作为一种记忆与代码权衡的手段,我选择使用两套而不是一本字典:
// 1. Data structure to track items we've seen
var found = new HashSet<Tuple<string, int>>();
// 2. Data structure to track items we should output
var output = new HashSet<Tuple<string, int>>();
// 3. Loop over the input data, storing it into `found`
using (var input = File.OpenText(path))
{
string line;
while (null != (line = input.ReadLine()))
{
// 4. Do your CSV parsing
var parts = line.Split(','); // <- need better CSV parsing
var item = Tuple.Create(parts[0], Int32.Parse(parts[1]));
// 5. Track items we've found and those we should output
// NB: HashSet.Add returns `false` if it already exists,
// so we use that as our criteria to mark the item for output
if (!found.Add(item)) output.Add(item);
}
}
// 6. Output the items
// NB: you could put this in the main loop and borrow the same strategy
// we used for `found` to determine when to output an item so that only
// one pass is needed to read and write the data.
答案 1 :(得分:1)
在不知道具体细节的情况下,我将采取的第一步是研究Linq To CVS库,例如...
http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library