2

100000 を超えるエントリを含む可能性のある csv ファイルのエントリを比較し、ペアを見つけて別のファイルに保存する必要があります。比較では、たとえば次のように 2 つ以上の列の値をチェックする必要があります。

犬 5

キャッツ 7

マウス 5

犬 3

犬 5

この例では、ペア {Dogs, 5} を取り上げ、残りを無視する必要があります。どのようなアプローチをお勧めしますか?

いつもありがとう

4

2 に答える 2

2

Tupleスキーマが本当にこれだけの場合は、とを使用して最小限のコードで実行できますHashSet<T>

いずれの場合も、基本的な戦略は、見たものを追跡するためのデータ構造を作成し、それを使用して何を出力するかを決定することです。辞書追跡カウントも使用できます。ただし、メモリとコードのトレードオフの手段として、1つの辞書ではなく2つのセットを使用することを選択しました。

// 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.
于 2012-05-07T12:58:55.087 に答える
1

正確な詳細を知らなくても、私がとる最初のステップは、このようなLinq To CVSライブラリを調べることです...

http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library

于 2012-05-07T12:59:59.250 に答える