2014-02-16 63 views
6

不好意思問一個很多人可能認爲已經被問到的問題。使用C++篩選CSV數據

我有一個很長的CSV數據文件(dat.csv)與5列。我有另一個帶有1列的簡短CSV(filter.csv)文件。

現在,我只需要從dat.csv中提取列,其中column-1與filter.csv的column-1匹配。

我通常會在BASH中使用sed/awk來做到這一點。但是,由於其他原因,我需要在C++文件中執行此操作。你能建議一個有效的方法來做到這一點?

樣本數據:

data.csv

ID,Name,CountryCode,District,Population 

3793,NewYork,USA,NewYork,8008278 
3794,LosAngeles,USA,California,3694820 
3795,Chicago,USA,Illinois,2896016 
3796,Houston,USA,Texas,1953631 
3797,Philadelphia,USA,Pennsylvania,1517550 
3798,Phoenix,USA ,Arizona,45 
3799,SanDiego,USA,California,1223400 
3800,Dallas,USA,Texas,1188580 
3801,SanAntonio,USA,Texas,1144646 

filter.csv

3793 
3797 
3798 
+2

請參閱http://stackoverflow.com/q/1120140/10077您的問題與此有何不同? –

回答

0

這裏有一些提示:

  1. 您從中讀取數據的流需要忽略逗號,因此應該使用填充在其語言環境中的std::ctype<char>構面將逗號字符設置爲空白。以下是修改分類表的示例:

    struct ctype : std::ctype<char> 
    { 
    private: 
        static mask* get_table() 
        { 
         static std::vector<mask> v(classic_table(), 
                classic_table() + table_size); 
    
         v[','] &= ~space; 
         return &v[0]; 
        } 
    public: 
        ctype() : std::ctype<char>(get_table()) { } 
    }; 
    
  2. 讀取第一個csv。文件行式(意思是std::getline())。提取第一個單詞並將其與第二個.csv文件中的提取進行比較。

    int main() 
    { 
        std::ifstream in1("test1.csv"); 
        std::ifstream in2("test2.csv"); 
    
        typedef std::istream_iterator<std::string> It; 
    
        in1 >> comma_whitespace; 
        in2 >> comma_whitespace; 
    
        std::vector<std::string> in2_content(It(in2), It()); 
        std::vector<std::string> matches; 
    
        while (std::getline(in1, line)) 
        { 
         std::istringstream iss(line); 
         It beg(iss); 
    
         if (std::find(in2_content.begin(), 
             in2_content.end(), *beg) != in2_content.end()) 
         { 
          matches.push_back(line); 
         } 
        } 
    } 
    
    // After the above, the vector matches should hold all the rows that 
    // have the same ID number as in the second csv file 
    

    comma_whitespace是更改區域上面定義的自定義ctype操縱:直到你到達的第一個文件的末尾繼續此。

    聲明:我還沒有測試過這個代碼。

+0

感謝0x499602D2抽空回答。非常感謝。 – hashb

7

此.csv分揀庫可能會幫助:

http://www.partow.net/programming/dsvfilter/index.html

你可以在兩個表的列合併成一個更大的表,然後查詢在新表中比賽(其中列表A的1是,表B的第1欄是)。或者,也許該圖書館具有比較表的功能。

+0

我剛剛下載了該庫。但是,我無法編譯它。似乎Expression Toolkit庫的解析器不包含兩個函數cache_symbols和expression_symbols。你有同樣的問題嗎? – v4r

+0

很抱歉,我很久以前錯過了您的回覆:p和我會研究是否以及如何最終使用該庫,然後回覆給您。 (你有沒有發現另一個工作解決方案?) –