如何对多列进行排序:CSV? C ++

时间:2015-07-02 20:46:11

标签: sorting csv c++11 vector stl-algorithm

我正在尝试通过指定要排序的列顺序对CSV文件进行排序:

例如:./csort 3,1,5<数据> SORTED_DATA

或./csort 3,4,6,2,1,5<数据......

DATA的示例行:177,27,2,42,285,220

我使用了vector split(string str)函数来存储需要排序的参数中指定的列。创建一个向量:

vector<string> columns {3, 1, 5}; // for example

不完全确定如何使用此列向量来继续排序过程;但是,我知道我可以使用sort。

sort(v.begin(), v.end(), myfunction);

2 个答案:

答案 0 :(得分:1)

据我了解你的问题,你已经将数据解析为4个向量,每列1个向量,并且你希望能够对数据进行排序,指定要排序的列的优先级 - 即按col1排序,然后是col3,然后是col4 ......

你想做的事情并不困难,但你必须稍微退缩一下。有多种方法可以解决这个问题,但这是一个粗略的概述。根据您在问题中展示的专业水平,您可能需要在以下大纲中查看一些术语,但如果您这样做,您将有一个很好的灵活解决方案来解决您的问题。

  1. 您希望按行存储数据,因为您要对行进行排序... 4列的4个向量无法帮助您。如果行中的所有4个元素都是相同的类型,则可以对该行使用std :: vector或std :: array。如果#cols已知编译时间,则std :: array是可靠的,std :: vector用于运行时。如果类型是不均匀的,您可以使用元组或结构。无论您使用何种类型,我们都称之为RowT。

  2. 解析并存储到您的行中,创建一个RowT向量。

  3. 定义一个函数对象,它为RowT的左侧和右侧提供()运算符。它必须实现&#34;少于操作&#34;遵循您想要的优先顺序。让我们称之为CustomSorter类。

  4. 一旦你有了这个,你的最终排序将是:

    CustomSorter cs(/*precedence arguments*/);
    std::sort(rows.begin(), rows.end(), cs);
    

    一切都非常简单,在一个例子中可以看到一个基本的例子here。根据我的经验,您必须处理的唯一部分是排序算法本身。

答案 1 :(得分:0)

最简单的方法是使用一个具有索引列表的类作为成员,并遍历列表以查看该项是否小于另一个。

class VecLess
{
    std::vector<int> indexes;
public:
    VecLess(std::vector<int> init) : indexes(init)
    {
    }
    bool operator()(const std::vector<string> & lhs, const std::vector<string> rhs)
    {
        for (auto i = indexes.begin(); i != indexes.end(); ++i)
        {
            if (lhs[*i] < rhs[*i])
                return true;
            if (rhs[*i] < lhs[*i])
                return false;
        }
        return false;
    }
};