我正试图通过指定排序的列顺序对CSV文件进行排序:
例如:/csort 3,1,5<DATA>SORTED_DATA
或/csort 3、4、6、2、1、5<数据。。。
数据示例行:177,27,2,42285220
我使用了一个向量分割(字符串str(函数来存储参数中指定的需要排序的列。创建矢量:
vector<string> columns {3, 1, 5}; // for example
不完全确定如何使用这个列向量来进行排序过程;不过,我知道我可以使用sort.
sort(v.begin(), v.end(), myfunction);
根据我对您的问题的理解,您已经将数据解析为4个向量,每列1个向量,并且您希望能够对数据进行排序,指定要排序的列的优先级,即按col1、col3、col4排序…
你想做的事情并不太难,但你必须后退一点。解决这个问题有多种方法,但这里有一个粗略的概述。根据你在问题中表现出的专业水平,你可能需要在下面的大纲中寻找一些术语,但如果你这样做了,你就会有一个很好的、灵活的问题解决方案。
-
您希望按行存储数据,因为您希望对行进行排序。。。4列的4矢量在这里对您没有帮助。如果行中的所有4个元素都是相同的类型,则可以使用std::vector或std::array作为行。如果#cols是已知的编译时,那么std::array是实心的,对于运行时,std::vector是实心的。如果类型是不均匀的,可以使用元组或结构。无论你使用什么类型,我们都称之为RowT。
-
解析并存储到您的行中,生成RowT的向量。
-
定义一个函数对象,该对象为RowT的左侧和右侧提供((运算符。它必须按照您想要的优先级实现"小于运算"。让我们调用该类CustomSorter。
一旦你有了它,你的最终排序将是:
CustomSorter cs(/*precedence arguments*/);
std::sort(rows.begin(), rows.end(), cs);
一切都非常简单,在customsort示例中可以看到一个基本示例。根据我的经验,你唯一需要处理的部分就是排序算法本身。
最简单的方法是使用一个具有索引列表的类作为成员,并遍历该列表以查看该项是否小于另一项。
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;
}
};