楼主: 
pziyout (pziyout)   
2017-03-03 15:55:41※ 引述《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