Re: [建议] 用于处理分字段文字档的程式语言或软件

楼主: 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

Links booklink

Contact Us: admin [ a t ] ucptt.com