C++ 使用C+过滤CSV数据+;

C++ 使用C+过滤CSV数据+;,c++,csv,filter,C++,Csv,Filter,很抱歉问了一个很多人认为已经被问过的问题 我有一个非常长的CSV数据文件(dat.CSV),有5列。我还有一个简短的CSV(filter.CSV)文件,有一列 现在,我只需要从dat.csv中提取列,其中列1与filter.csv的列1匹配 我通常会在BASH中使用sed/awk。但是,由于其他一些原因,我需要在C++文件中这样做。你能建议一个有效的方法吗 样本数据: data.csv filter.csv 以下是一些提示: 从中读取数据的流需要忽略逗号,因此应该使用其区域设置中嵌入的std::

很抱歉问了一个很多人认为已经被问过的问题

我有一个非常长的CSV数据文件(dat.CSV),有5列。我还有一个简短的CSV(filter.CSV)文件,有一列

现在,我只需要从dat.csv中提取列,其中列1与filter.csv的列1匹配

我通常会在BASH中使用
sed/awk
。但是,由于其他一些原因,我需要在C++文件中这样做。你能建议一个有效的方法吗

样本数据:

data.csv

filter.csv

以下是一些提示:

  • 从中读取数据的流需要忽略逗号,因此应该使用其区域设置中嵌入的
    std::ctype
    facet将逗号字符设置为空白。下面是修改分类表的示例:

    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()) { }
    };
    
    comma_whitespace
    是一个操纵器,它将区域设置更改为上面定义的自定义
    ctype

    免责声明:我尚未测试此代码


  • 此.csv排序库可能有助于:


    您可以将两个表的列合并到一个较大的表中,然后在新表中查询匹配项(其中表A的第1列为,表B的第1列为)。或者该库具有比较表格的功能。

    查看您的问题与此有何不同?感谢0x499602D2花时间回答。非常感谢。我刚刚下载了图书馆。但是,我不能编译它。expressiontoolkit库的解析器似乎不包含两个函数cache_符号和Expression_符号。你也有同样的问题吗?很抱歉,我很久以前没有收到你的回复:p,我会调查我是否以及如何使用了那个库,然后再给你回复。(您是否找到了其他可行的解决方案?)
    3793
    3797
    3798
    
    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()) { }
    };
    
    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