重新排列文本文件中的行列

时间:2013-09-27 20:02:46

标签: c++ stream xcode5

我有一个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 个答案:

答案 0 :(得分:1)

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

在此课程中,您可以编写方法以按您希望的任何顺序显示数据。

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

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

答案 1 :(得分: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();
}

答案 2 :(得分:0)

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

棘手的部分是当你试图解析人名时。由于一个人的名字可能包含多个字符串。从而使名称的识别部分变得困难。

vinaut 所说的几乎相同。

答案 3 :(得分: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