2013-09-27 29 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

我不能創建變量下的名稱和時間,然後將它們添加到線:出<< v.first <<名字<<時間<<「\ n \; –

+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