2016-02-16 55 views
1

所以在概念上,我正在讀取一個包含大約200萬行數據的文件。我期待在後面對數據進行排序,存儲和應用其他功能。讀取/排序一個大的.CSV文件

  1. 我被告知這被稱爲「桶」,但我不清楚這是預先定義的還是用戶定義的數據類型。所以我很好奇鏈表或數組或者其他組合是否可行?

  2. 我需要擔心文件的大小嗎?大多數編譯器能夠同時處理所有這些問題,還是需要先分割數據(即分成每個桶,存儲在自己的文件中,然後使用另一個代碼等)?

  3. 如果#2是必需的,C++是否具有保存每次執行多個文件的功能?意思是a)創建bucket1 file.txt; b)填充bucket1文件;關閉bucket1文件; d)創建bucket2文件; ...

回答

0

好的,所以我從你的帖子中收集到你正在用C++寫這篇文章。但是,除了排序要求,細節有點稀疏。但是你在排序什麼?所有字段都解釋爲文本嗎?有些數字?有多個鍵嗎?

如果您不一定需要使用C++編寫此代碼,並且您使用的是Linux,則只需調用/ bin/sort即可進行排序。這可能看起來像是一個警察,但是像Talend這樣的商業軟件甚至可以做到這一點。

但是如果你必須在C++編寫新的代碼,這是我的建議:

1)爲CSV文件逃脫?換句話說,嵌入的引號和分隔符是否需要特殊處理?你必須先解決這個問題。

2)檢查了這一點:http://mybyteofcode.blogspot.com/2010/02/parse-csv-file-with-boost-tokenizer-in.html

3)掃描輸入的簡單表示是vector<vector<string> >。但它很笨拙。相反,圍繞vector<string>包裝一個類,並向這些類指出一個向量,每行輸入一行,然後對它們進行排序。

4)你應該能夠在內存中排序~2M「中」行。只需使用std :: sort。但是爲了完整的概括性,你需要考慮,如果它不適合記憶呢?對此最常見的答案是一次對塊進行排序,將結果寫入磁盤,然後使用優先級隊列或類似結構合併它們。

+0

文件示例: 「1055,1055,1042,3006,3072,3031,3342,236」 我想存儲第7個定義的存儲桶中的前6個值。沒有明顯的限制,第6,7時隙似乎在0和450之間。 除逗號和eol外,沒有特殊字符或分隔符。 謝謝你的鏈接和其他指針。 – Jarrell