0

我想使用 C 获取大型数据文件的列的不同计数。我该怎么做。请告诉我。谢谢。我的示例数据文件如下。

对于第二个属性,不同的计数是 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 行,nth列即有 2 个不同的值。34563457。您的列搜索树nth将如下所示: 第 n 列的搜索树

你最终会得到 6 棵搜索树。阅读整个文件后,遍历每个搜索树中的所有可能路径,这将为您提供不同值的数量。

于 2012-11-25T00:46:48.523 回答
1
  • 阅读并拆分每一行。
  • 将第二个属性放入一个数组中。
  • qsort数组

您现在有一个彼此相邻的相等字符串的数组。您可以遍历数组并计算不同的条目。

如果您的条目都是 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,你将不得不为 C 找到一些 hashmap 库,比如sparsehash

如果数据量真的非常大,那么它可能不会适合内存。在这种情况下,我建议使用 SQLite 临时数据库来解析、存储和索引您的数据,然后SELECT DISTINCT在其上使用标准。

于 2012-11-25T00:16:08.220 回答