Re: [建議] 用於處理分欄位文字檔的程式語言或軟體
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章