Re: [建議] 用於處理分欄位文字檔的程式語言或軟體

看板Programming作者 (pziyout)時間7年前 (2017/03/03 15:55), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《Neisseria (Neisseria)》之銘言: : 我們實驗室最近在跑某個科學運算軟體 : 出來的格式是以 tab 分欄的文字檔,如下例: : case 2 case 4 case 1 case 3 ctrl 3 ctrl 2 ctrl 4 ctrl 1 : item 1 : item 2 : item 3 : ... : 主要的問題在於 case 1, case 2, case 3, ... 和 ctrl 1, ctrl 2, ctrl 3, ... : 的順序會隨機排列,而且找不到參數去改變這個行為 : 目前只能手動將其按順序重排 這一題滿有趣的,我用 C++ 試寫也是很快,檔案假設是 以定位鍵當資料的區隔,程式如下: #include <iostream> #include <fstream> #include <algorithm> #include <sstream> #include <vector> #include <iomanip> using namespace std ; // 輸入檔名當參數 int main( int argc , char* argv[] ) { int i , j , k , n ; ifstream infile(argv[1]) ; string line , str , str2 ; vector<int> conn ; vector<string> foo , bar , tmps ; getline(infile,line) ; istringstream istr(line) ; // \t 鍵區隔資料 while ( getline(istr,str,'\t') ) { if ( str.size() != 0 ) foo.push_back(str) ; } istr.clear() ; bar = foo ; sort(bar.begin(),bar.end()) ; n = foo.size() ; conn.resize(n) ; for ( i = 0 ; i < n ; ++i ) { j = find(bar.begin(),bar.end(),foo[i]) - bar.begin() ; conn[j] = i ; } cout << setw(10) << " " ; for ( i = 0 ; i < n ; ++i ) cout << setw(10) << bar[i] ; cout << endl ; tmps.resize(n) ; while ( getline(infile,line) ) { istr.str(line) ; for ( i = 0 ; getline(istr,str,'\t') ; ++i ) { if ( i == 0 ) { cout << setw(10) << str ; } else { tmps[i-1] = str ; } } istr.clear() ; for ( i = 0 ; i < n ; ++i ) { cout << setw(10) << tmps[conn[i]] ; } cout << endl ; } return 0 ; } 我測試的資料檔為: col 5 col 2 col 1 col 3 col 4 row1 2 3 7 5 8 row2 1 2 9 3 9 row3 5 3 8 6 1 row4 4 1 7 8 3 col 1 col 3 col 4 col 5 col 2 row1 7 5 8 2 3 row2 9 3 9 1 2 row3 8 6 1 5 3 row4 7 8 3 4 1 以上資料是以 tab 鍵區隔資料,兩個輸出都是: col 1 col 2 col 3 col 4 col 5 row1 7 3 5 8 2 row2 9 2 3 9 1 row3 8 3 6 1 5 row4 7 1 8 3 4 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.25.29 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1488527743.A.46D.html
文章代碼(AID): #1OkI5_Hj (Programming)
文章代碼(AID): #1OkI5_Hj (Programming)