У меня есть текстовый файл с 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();
}
Я предлагаю вам использовать класс или структуру с одним членом, представляющим каждый столбец в таблице. Один экземпляр представляет одну строку.
Из этого класса вы можете написать методы для отображения данных в любом порядке.
Вы можете написать классы сортировки для сортировки объектов по любому члену.
Поиск StackOverflow для «чтения из файла» для примеров чтения данных из файла.
Вы рассматриваете каждую строку как одну строку: единственный способ переупорядочить поля — извлечь каждое поле и вывести его отдельно. В моем примере используется структура с полями, которые вы хотите вывести.
#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();
}
Существует не очень простой способ сделать это. Я думаю, что вы должны делать, это читать каждую строку по одной и разбирать их в какую-то структуру. Затем отобразите / напишите соответствующие элементы по вашему желанию.
Сложнее всего, когда вы пытаетесь разобрать имя человека. Как имя человека может состоять из нескольких строк. Таким образом, сделать идентификацию имени части сложно.
Почти так же, как и то, что vinaut сказал.
$ 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