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

How to sort multiple columns: CSV? c++

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

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

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

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

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

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

不完全确定如何使用这个列向量来进行排序过程;不过,我知道我可以使用排序。

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

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

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;
    }
};

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

你想做的事情并不太难,但你得往回走一点。有多种方法可以解决这个问题,但这里有一个粗略的概述。根据您在问题中表现出的专业水平,您可能需要查看以下大纲中的一些术语,但如果您这样做,您将有一个很好的灵活解决方案。

  1. 您想按行存储数据,因为您想对行进行排序...4 列的 4 个向量在这里对您没有帮助。如果该行中的所有 4 个元素都是同一类型,您可以对该行使用 std::vector 或 std::array。 std::array 如果 #cols 是编译时已知的,std::vector 是运行时的。如果类型不均匀,您可以使用元组或结构。无论您使用哪种类型,我们都将其称为 RowT。

  2. 解析并存储到你的行中,制作一个 RowT 向量。

  3. 定义一个函数对象,它为 RowT 的左侧和右侧提供 () 运算符。它必须按照您想要的优先级实现 "less than operation" 。让我们称之为 class CustomSorter。

完成后,您的最终排序将是:

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

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