2013-09-27 4 views
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(); 
} 
+0

Я не могу создать имя и время varibles, а затем добавить их к линии: из << v.first << название << Время << «\ п \; –

+0

Что должно быть третья версия из этого вопроса? Сначала это [это] (http://stackoverflow.com/q/19055100/1870232). Мне интересно, это [XY] (http://meta.stackexchange.com/q/66377/ 232397)? – P0W

+0

Если все строки расположены в одном порядке, вы можете получить каждую отдельную информацию строки с #include stringstream. Упорядочение всей информации может быть возможно с помощью некоторой std :: vector конструкции, а затем вам просто нужно распечатать из-за правильных индексов. У меня возникли проблемы? – Martin

ответ

1

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

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

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

Поиск 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(); 
} 
0

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

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

В значительной степени то же, что и 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 
Смежные вопросы