2012-04-30 77 views
1

得到了我的跳轉日誌的csv文件,並希望在每個塊(跳轉記錄)內進行排序,這樣,入侵者首先被列出,學生第二和可選的攝影師最後。 當前它們按各種順序書寫。按行分析和排序csv文件

正在考慮讀取並將塊的每一行分配爲變量,然後使用空行作爲循環控制器進行打印。我在正確的軌道上嗎? 希望在C++中有解決方案的幫助(一點點的實驗和一個編譯器設置),但我很喜歡flexi,並且希望能在今年夏天真正涉足任何推薦語言。可能的Python或任何一個有CompSci的好書介紹。

任何建議&參考非常感謝!

第一列是角色:1,2,3。

角色(1,2,3),日期(YYYMMDD),飛機-liftnumber,名稱 角色1是串聯指導員, 角色2是一個學生, 角色3自由落體攝像頭(可選)

1,20100124,C206WR-L1,MAC PETE

2,20100124,C206WR-L1,HOWARD斯蒂芬

3,20100124,C206WR-L1,JONES DAVE

,,,

2,20100124,C206WR-L3,奧爾索普BEX

1,20100124,C206WR-L3,MAC PETE

3,20100124,C206WR-L3,JONES DAVE

,,,

1,20100124,C206WR-L2,MAC PETE

3,20100124,C206WR-L2,LAUER FINCH

2,20100124,C206WR-L2,JONES DAVE

,,,

1,20100124,C206WR-L4,MAC PETE

3,20100124,C206WR-L4,LAUER FINCH

2,20100124,C206WR-L4,JONES DAVE

,,,

2,20100124,C206WR-L4,JOHN SMITH

1,20100124,C206WR- L4,MAC PETE

,,,

2,20100124,C206WR-L5,BROWN CLAIRE

3,20100124,C206WR-L5,JONES DAVE

1,20100124,C206WR-L5 ,MAC PETE

回答

0

嘗試使用一個std :: multimap中同時插入對它們進行排序,也不會丟失任何數據,因爲多重映射可以有多個相同的密鑰值。 (在這種情況下,鍵值將是角色編號。)因此,數據將按您的要求排序。

+0

除非我誤解,在OP想每行不排序的所有行成圖進行排序。 – Benj

+0

好了,然後對於每個數據塊,他需要使用std :: map(因爲鍵值重複不會發生),並且每個塊都被排序。 – phantasmagoria

0

你可以使用拆分功能,每個CSV線分解成一個變量的vector<string>。下面是一個例子分割功能,可爲std :: string和字符分隔符被調用(而你的情況將是「」):

template<typename T> 
static inline std::vector<std::basic_string<T>> split(const std::basic_string<T>& s, T c) 
{ 
    std::vector<std::basic_string<T>> v; 

    if (!s.length()) 
     return v; 

    std::basic_string<T>::size_type i = 0, j = s.find(c); 

    while (j != std::basic_string<T>::npos) 
    { 
     v.push_back(s.substr(i, j - i)); 
     i = ++j; 
     j = s.find(c, j); 
    } 

    v.push_back(s.substr(i, s.length())); 

    return v; 
} 

然後,你可以簡單地打印出的順序變量,你選擇。

0

有很多方法對皮膚這隻貓,我將介紹一個,這更接近我:使用解析器生成器(例如AX,精神)。由於我與AX密切familar,這裏是你的數據結構的C++語法:

using axe::shortcuts; 

// for role you can use a digit, you can additionally contrain it 
auto role_rule = _d; 
// or you can use char literals instead 
// auto role_rule = axe::r_any("123"); 

// for date you can use digits or axe::r_decimal, depending on what you want to do with it 
auto year_rule = axe::r_many(_d, 4); 
auto month_rule = _d & _d; 
auto date_rule = _d & _d; 

// aircraft-liftnumber: as far as I understand it's alpha-numeric 
auto aircraft_rule = +_w & '-' & +_w; 

// name is two alpha strings separated by spaces 
auto first_name_rule = axe::r_alphastr(); 
auto last_name_rule = axe::r_alphastr(); 
auto name_rule = last_name_rule & +_ws & first_name_rule; 

// a rule to extract all information from the line 
std::string line; // read line from file 
struct record { 
unsigned role, year, month, day; 
std::string aircraft, name; 
}; 

record rec; 

auto line_rule = role >> rec.role & ',' 
& year_rule >> rec.year & ',' 
& month_rule >> rec.month & ',' 
& day_rule >> rec.day & ',' 
& aircraft_rule >> rec.aircraft & ',' 
& name_rule >> rec.name & *_n; 

std::vector<record> file_records; 

auto file_rule = *(line_rule >> axe::e_ref([&](...) 
{ 
    file_records.push_back(rec); 
})) & _z; 

// read your file to a vector without filtering 
std::ifstream csv_file("filename", std::ios::binary); 
std::vector<char> cvs_content(
    std::istreambuf_iterator<char>(cvs_file), 
    std::istreambuf_iterator<char>()); 

if(!file_rule(cvs_content.begin(), cvs_content.end()).matched()) 
    throw "file corrupt";