【问题标题】:sorting a csv file according to column in C++根据 C++ 中的列对 csv 文件进行排序
【发布时间】:2015-09-07 13:45:16
【问题描述】:

我的任务是根据用户输入对 csv 文件进行排序

数据如下:

California,USA,65,76,65,67
Paris,France,78,65,97,87
Tokyo,Japan,56,78,67,87
New York,USA,54,65,67,44,67

或者基本上列代表

City,Country,q1 average temperature, q2 average temperature, q3 , q4

我的任务是根据列对其进行排序:城市作为第 1 列,国家/地区第 2 列,依此类推...取决于用户输入。

所以如果用户输入是1dec,这意味着它将按第一列排序(在这种情况下按字母顺序)并打印排序后的数据

对于上面的示例,它将打印为:

Tokyo,Japan,56,78,67,87
Paris,France,78,65,97,87
New York,USA,65,67,67,44,67
California,USA,65,76,65,67

用户还可以输入多个输入,例如2asc,3dec,4dec,这意味着第 2 列将首先按升序排序,如果该列中有相似的数据,则将使用第 3 列显示它们降序,那么如果它仍然是相同的使用第 4 列。

对于上面的示例,如果使用2asc,3dec,4dec 调用,它将打印为:

Paris,France,78,65,97,87
Tokyo,Japan,56,78,67,87
California,USA,65,76,65,67
New York,USA,65,67,67,44,67

我的问题是,我应该如何解决这个问题? 我应该使用哪种数据结构最好?

PS。不是真的要求代码示例,但我只是要求一些提示 或如果您遇到此类问题的方法

【问题讨论】:

  • 不打算为你做作业.. 到目前为止你有什么?
  • 创建一个包含 csv 行的结构体,将其放入 stl 容器中,创建一个函子来检查结构体的两个实例之间的字典顺序,并在容器中使用 std::sort
  • @XDProgrammer 1) Jepessen 的建议似乎正是您所需要的。 2)有一个经验法则:如果您不知道哪种类型的容器更好 - 使用std::vector
  • 排序有点棘手:我建议如果你将数据放入struct X,添加一个函数int compareColumn(int column_num, const X& rhs) const,如果*this的值在列中返回-1 column_num 小于 rhs's,0 如果它们相等,否则 1。然后,您可以编写一个使用compareColumn 函数三次的bool less(int column_num_A, bool ascending_A, int column_num_B, bool ascending_B, int column_num_C, bool ascending_C);。 (可以通过采用列号/升序标志的vector<pair<int, bool>> 来进一步概括。)
  • 如果您选择尝试vector<vector<string>>,请注意一点——您可能需要对数字列进行一些额外处理以避免string 的词法比较:例如"10" < "2".

标签: c++ sorting csv


【解决方案1】:

这是一个你可以使用的方法,希望你觉得它直观

  1. 读取数据并将其放入一个未排序的向量中,其中包含代表真实世界数据的对象(类)。
  2. 解析用户输入以决定列和排序顺序
  3. 使用简单的排序算法(例如选择排序)将数据添加到已排序的向量中。
  4. 遍历排序后的向量并输出结果。

【讨论】:

    【解决方案2】:

    我的问题是,我应该如何解决这个问题?哪个最好 我应该使用数据结构吗?

    你应该使用几种数据结构,但是如果你使用一个向量来存储输入列表(如果它很大的话),你最好使用 reserve 方法,这样你就可以避免多次重新分配向量。

    另一个有趣的点是以相反的顺序重复应用排序标准,这样您就可以轻松地按照多个标准对输出进行排序。

    如果您重视性能,您应该使用更复杂的方法。

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多