2011-11-16 39 views
1

我正在尋找關於創建數據拖網例程的最有效途徑的一般性建議。我有C++的基本知識。數據拖網例程的啓動建議

我需要創建一個常規的通過具有以下格式(例如)一個文本文件中搜索:

4515397 404.4 62.5 1607.0  2.4  0.9 ... 
4515398 404.4 62.3 1607.0  3.4  1.2 ... 
4515399 404.4 62.2 1608.0  4.6  0.8 ... 
4515400 405.1 62.2 1612.0  5.8  0.2 ... 
4515401 405.9 62.2 1615.0  6.9 -0.8 ... 
4515402 406.8 62.2 1617.0  8.0 -2.7 ... 
4515403 406.7 62.1 1616.0  9.0 -5.3 ... 

在上面的例子中,我感興趣的出口2列平均值, 3,第5列和第6列均小於4。實際上,我對第1,4或7列中的值沒有興趣(橢圓正是它們在文件本身中的顯示方式)。

使事態進一步複雜化,文字的偶然隨機字符串出現在文件中,像這樣的(這些可以扔掉):

4522787 429.6 34.4 2024.0 .  . ... 
4522788 429.9 34.2 2022.0 .  . ... 
4522789 429.9 34.1 2022.0 .  . ... 
EFIX R 4522633 4522789 157 427.9 36.8 2009 
4522790 429.3 34.2 2021.0 .  . ... 
END 4522791  SAMPLES EVENTS RES 23.91 23.82 
MSG 4522799 TRIAL_RESULT 0 
MSG 4522799 TRIAL OK 

最後,每一個文本文件包含五套數據中,我打算對價值進行平均。這5個數據組中的每一個由線像這樣限定:

MSG 4502281 START_GRAB 

MSG 4512283 END_GRAB 

這些邊界之外一切都可以扔掉。

因此,作爲一個相對缺乏經驗的程序員,我開始考慮實現目標的最有效方法。什麼是我最好的方法;即C++對於這類任務來說是不必要的複雜?也許甚至有一種公用工具可以做這種數據拖網?

現在我發現我可能會使用Microsoft Excel腳本來爲我做這件事。我想知道關於此的任何想法。

+0

我會做這在Python中,或類似的腳本語言,而不是C++。 – Oliver

+0

您可以使用「awk」工具來完成此操作。 – mskfisher

+0

我可以使用的工具是C++,Excel或MATLAB。任何其他可能(我認爲)涉及更多的時間來學習,而不是寫在C++中會花費 – CaptainProg

回答

1

我會用幼稚的方式開始,看多遠我會得到:

#include <fstream> 
#include <sstream> 
#include <string> 
#include <vector> 
#include <algorithm> 

int main() 
{ 
    std::ifstream infile("thefile.txt"); 
    if (!infile) { return 0; } 

    std::vector<double> v2, v3; 

    std::string line; 
    while (std::getline(infile, line)) 
    { 
    int id; 
    double col1, col2, col3, col4, col5, col6; 
    std::istringstream iss(line); 

    if (iss >> id >> col1 >> col2 >> col3 >> col4 >> col5 >> col6) 
    { 
     // we only get here if the first token is an integer! 

     if (col5 < 4.0 && col6 < 4.0) 
     { 
     v2.push_back(col2); 
     v3.push_back(col3); 
     } 
    } 
    else 
    { 
     iss.clear(); // clear error 
     std::string id; 
     if (iss >> id && id == "MSG") 
     { 
     // process the special block 
     } 
    } 
    } 

    // now compute the average of the v2 and v3: 
    double av2 = std::accumulate(v2.begin(), v2.end(), 0)/double(v2.size()); 
    double av3 = std::accumulate(v3.begin(), v3.end(), 0)/double(v3.size()); 
} 
0

如果你想用C++來解決這個問題,我強烈建議Boost regex

基本上,你需要三個正則表達式:一個爲START_GRAB,一個有效載荷線和一個用於END_GRAB線。編寫正則表達式不是太難。有很多在線教程,你可以在這裏試試你的正則表達式:

http://gskinner.com/RegExr/