0

我有一个包含 200 行的文本文件,如下所示:

1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200 
2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870 

我的代码按照每个参赛者的出生年份而不是上面示例中的时间对这些行进行排序。所以现在这些行是这样排序的:(只有更多的行)

2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870 
1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200

我的问题是我现在如何列出三件事:年份 - 名称 - 时间......以便这两行看起来像这样:

1987   Gudni Pall Palsson    4:52:25  
1979   Orvar Steingrimsson   4:48:08

到目前为止,我的代码以正确的顺序对行进行排序:

#include <iostream> //for basic functions
#include <fstream> //for basic file operations
#include <string> //for string operations
#include <map> //for multimap functions

using namespace std;

int main ()
{
ifstream  in("laugavegurinn.txt", ios::in);
ofstream out("laugavegurinn2.txt");
string str;
multimap<int, string> datayear; //creates multimap linking each line to year

in.ignore(80);//ignores header of the file - 80 characters - to escape problems with while loop

// while (getline(in,str)) {
 //   string name = str.substr(18,30);
   // string time = str.substr(8,7);

//}


while (getline(in,str)) {
    int year = stoi(str.substr(54, 4));
    datayear.insert(make_pair(year,str)); //insert function and pairs year and string 
}

for (auto v : datayear)
    out << v.second << "\n";

in.close();
out.close();
}
4

4 回答 4

1

我建议您使用一个类或结构,其中一个成员代表表中的每一列。一个实例代表一行。

从这个类中,您可以编写方法以您希望的任何顺序显示数据。

您可以编写排序类来按任何成员对对象进行排序。

在 StackOverflow 中搜索“从文件中读取”以获取有关从文件中读取数据的示例。

于 2013-09-27T20:42:30.930 回答
1

您将每一行视为单个字符串:重新排列字段的唯一方法是提取每个字段并分别输出。我的示例使用带有要输出的字段的结构。

#include <iostream> //for basic functions
#include <fstream> //for basic file operations
#include <string> //for string operations
#include <map> //for multimap functions

using namespace std;

typedef struct {
  int year;
  string name;
  string time;
} Fields;

int main ()
{
  ifstream  in("names.txt", ios::in);
  ofstream out("namesout.txt");
  string str;
  multimap<int, Fields> data; //creates multimap linking each line to year

  in.ignore(80);

  Fields tempField;

  while (getline(in,str)) {
    tempField.year = stoi(str.substr(51, 4));
    tempField.name=  str.substr(15, 30);
    tempField.time=  str.substr(5, 8);
    data.insert(make_pair(tempField.year,tempField)); //insert function and pairs year and string
  }

  for (auto v : data)
    out << v.second.year << " " << v.second.name  << " " << v.second.time<< "\n";

  in.close();
  out.close();
}
于 2013-09-27T20:46:19.867 回答
0
$ cat file
2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870
1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200

$ sed -r 's/[[:digit:]]+[[:space:]]+([[:digit:]:]+)[[:space:]]+(.*[^[:space:]])[[:space:]]+([[:digit:]]{4})[[:space:]].*/\3 \2 \1/' file
1987 Gudni Pall Palsson 4:52:25
1979 Orvar Steingrimsson 4:48:08
于 2013-09-27T22:41:03.420 回答
0

没有真正简单的方法可以做到这一点。我认为您应该做的是一次读取每一行并将它们解析为某种结构。然后根据需要显示/写入适当的项目。

棘手的部分是当您尝试解析人名时。因为一个人的名字可能由多个字符串组成。从而使名称部分的识别变得困难。

vinaut说的差不多。

于 2013-09-27T21:00:15.457 回答