2012-11-25 38 views
0

我想使用C獲取大數據文件列的不同計數。如何才能做到這一點。請告訴我。謝謝。我的示例數據文件如下所示。如何使用C獲取列的不同計數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,0,fraud 
400471,v3473,p3225,41392,3710,fraud 
400498,v3476,p3225,102,23820,fraud 
401325,v4497,p3297,1322,1110,fraud 
+0

你試過了什麼?你在想什麼?你爲什麼不嘗試? –

回答

0

您可以使用std::map<std::string,int> - 將持有鍵值對,其中key是vNNNN,和值是重複的次數。

第一個循環將掃描輸入文件並填充該地圖,然後地圖上的鍵數將不同。

編輯:如果你不能使用C++並且需要C,你將不得不爲C尋找一個hashmap庫,如sparsehash

如果數據量真的很大,有可能它不適合內存。在這種情況下,我建議使用SQLite臨時數據庫來解析,存儲和索引數據,然後在其上使用標準SELECT DISTINCT

+0

這適用於C++,但不適用於C:( – dasblinkenlight

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); 
2

爲每一列創建一個搜索樹。假設文件中有10行,nth列即2個不同的值。 34563457。您的搜索樹nth列將如下所示: Search tree for nth column

您將以6個搜索樹結束。讀完整個文件後,遍歷每個搜索樹中的所有可能的路徑,這將爲您提供不同值的數量。

+0

+1,非常奇妙的解決方案:-) –

相關問題