0

Cを使用して大きなデータファイルの列の明確な数を取得したいのですが、どうすればよいですか。親切にアドバイスしてください。ありがとうございます。サンプルデータファイルは次のとおりです。

2番目の属性の場合、個別のカウントは6です。

399547,v4149,p3178,1990,2065,fraud
399940,v5852,p3194,8278,2180,fraud
399983,v3476,p3199,766,1125,fraud
400206,v3467,p3216,494,311000,fraud
400345,v4497,p3219,1211,432100,fraud
400471,v3473,p3225,41392,3710,fraud
400498,v3476,p3225,102,23820,fraud
401325,v4497,p3297,1322,1110,fraud
4

3 に答える 3

2

列ごとに検索ツリーを作成します。ファイルに 10 行あり、列に 2 つの異なる値があるとしnthます。34563457。列の検索ツリーは次のnthようになります。 n列目の探索木

検索ツリーは 6 つになります。ファイル全体を読み取ったら、各検索ツリーで可能なすべてのパスをトラバースすると、個別の値の数が得られます。

于 2012-11-25T00:46:48.523 に答える
1
  • すべての行を読み取って分割します。
  • 2 番目の属性を配列に入れます。
  • 配列を並べ替える

これで、等しい文字列が隣接する配列ができました。配列をループして、さまざまなエントリをカウントできます。

エントリがすべて 5 文字である場合、それ以外の場合はmalloc()、各属性を記憶する必要があります。

char (*array)[6];
int i;
int n; /* number of lines read */
int distinct = 1;
/* read the data file and put it into array */
/* qsort() array */
for (i = 1; i < n; ++i) {
    if (strcmp(array[i], array[i - 1]) != 0)
        ++distinct;
}

printf("There are %d distinct rows\n", distinct);
于 2012-11-25T00:33:35.170 に答える
0

使用できますstd::map<std::string,int>-キーと値のペアを保持します。キーはvNNNN、値は繰り返しの数です。

最初のループは入力ファイルをスキャンし、このマップにデータを入力します。次に、マップ内のキーの数が個別のカウントになります。

編集: C++ を使用できず、C が必要な場合は、sparsehashのような C 用のハッシュマップ ライブラリを見つける必要があります。

データの量が非常に大きい場合、メモリに収まらない可能性があります。この場合、SQLite 一時データベースを使用してデータを解析、保存、インデックス化し、標準を使用することをお勧めしますSELECT DISTINCT

于 2012-11-25T00:16:08.220 に答える