我有一个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();
}
答案 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