我想得到一个大型数据文件的列的不同计数使用C.How,我可以做me.Thanks.My样本数据文件如下。
对于第二个属性,不同的计数是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发布于 2012-11-25 08:46:49
为每一列创建一个搜索树。假设您在一个文件中有10行,nth列的两个不同的值。3456和3457。nth列的搜索树将如下所示:

你最终会得到6个搜索树。读完整个文件后,遍历每个搜索树中的所有可能路径,这将给出不同值的数量。
发布于 2012-11-25 08:33:35
读取并拆分每一行。
中
现在,您有了一个彼此相邻的具有相等字符串的数组。您可以遍历数组并计算不同的条目。
如果条目的长度都是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-25 08:16:08
您可以使用std::map<std::string,int> -它将保存键值对,其中key是vNNNN,value是重复次数。
第一次循环将扫描输入文件并填充此映射,然后映射中的键数将是不同的计数。
编辑:如果您不能使用C++而需要C语言,那么您必须找到一些用于C语言的哈希映射库,比如sparsehash。
如果数据量真的、真的很大,就有可能无法放入内存。在这种情况下,我建议使用SQLite临时数据库来解析、存储和索引您的数据,然后对其使用标准SELECT DISTINCT。
https://stackoverflow.com/questions/13546998
复制相似问题