переставить столбцы строк в текстовом файле

У меня есть текстовый файл с 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

Решение

Я предлагаю вам использовать класс или структуру с одним членом, представляющим каждый столбец в таблице. Один экземпляр представляет одну строку.

Из этого класса вы можете написать методы для отображения данных в любом порядке.

Вы можете написать классы сортировки для сортировки объектов по любому члену.

Поиск StackOverflow для «чтения из файла» для примеров чтения данных из файла.

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();
}
1

Существует не очень простой способ сделать это. Я думаю, что вы должны делать, это читать каждую строку по одной и разбирать их в какую-то структуру. Затем отобразите / напишите соответствующие элементы по вашему желанию.

Сложнее всего, когда вы пытаетесь разобрать имя человека. Как имя человека может состоять из нескольких строк. Таким образом, сделать идентификацию имени части сложно.

Почти так же, как и то, что vinaut сказал.

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
0
По вопросам рекламы [email protected]