2011-08-18 95 views
-2

一個.csv文件是這樣寫的:C++:讀一個CSV文件,並提取某些部分

M9005U00-X30A0S00-1;BAS;X;-0.002;-0.095 
    S707RY00-X30AOS00-1;HMV;X;+0.002;+0.081 
    W3005U00-X30BOJ00-1;BAS;X;+0.026;-0.138 
    H307QZ00-X30BOJ00-1;HMV;X;-0.025;+0.122 
    .... 

現在我想建立一個功能,即

 double find_and_extract (string sss) 

當此功能被使用以關鍵字爲參數,例如

 find_and_extract (W3005U00-X30BOJ00-1); 

它會在.csv文件中逐行搜索,找到相應的響應行(在這種情況下,它應該是第三行),並在此行中提取certin部分「+0.026」,返回爲double。

我該怎麼寫這個函數?

編輯:這是到目前爲止,我寫的代碼:

#include <iostream> 
    #include <fstream> 
    #include <string> 
    #include <stdio.h> 
    #include <vector> 
    #include <iterator> 
    #include <cstdlib> 
    #include <cstdio> 
    #include <sstream> 
    #include <stdlib.h> 

    using namespace std; 

    void main() 
     { 
      find_and_extract (W3005U00-X30BOJ00-1); 
     } 

    double find_and_extract (string sss) 
     { 
      vector<string> vecarray; 
      ifstream infile("C:\\Data\\testdata.csv"); 
      string temppo; 
      string contnt; 
      char csv_extract[40]; 
      stringstream ss; 
      vector <string>::iterator ptr; 
      while (!infile.eof()) 
       { 
       infile.getline(csv_extract,40); 
       ss << csv_extract; 
       ss >> contnt; 
       vecarray.push_back(contnt); 
       } 
      for (ptr=vecarray.begin();ptr!=vecarray.end();ptr++) 
      { 
       if ((*ptr).find(sss)==0) 
        temppo = (*ptr).substr(27,6); 
      } 
      return (strtod(temppo.c_str(),NULL,0)); 
     } 

誰能幫我指出錯誤?

+2

-1:你期望有人來做你的工作,而不是你?答案可能是 - 您應該使用衆所周知的最佳實踐編寫此功能,記住可維護性並處理可能的錯誤。 – agibalov

+1

我想說'getline','substr'和'strtod'是一個選項。 –

+1

即使它不起作用,你能告訴我們你試過的東西嗎?如果你一開始就陷入困境,請指出,以及爲什麼你被困住了。 –

回答

0

鑑於您已經將該文件作爲字符串使用,我會使用Knuth-Morris-Pratt算法來查找關鍵字,找到該行上第3個和第4個分號的位置,並將該字符串返回它們之間。

這只是一個大綱 - 你需要添加錯誤處理。

0

您可以使用sed:這樣,您可以非常高效地搜索密鑰,而無需親自實施算法。當你找到密鑰時,你可以讓sed輸出你需要的行的部分(使用正則表達式來描述模式和分組,只打印它的一部分)。之後,這是一個簡單的字符串浮動轉換,可以用您選擇的編程語言完成。

對於初學者:

sed -n 's/RegexToMatchYourKeyAndValues/MatchedValues/p' 
0

退房strtok()。這實際上是一項非常簡單的任務,如果你還不熟悉C++,那麼這應該是一個很好的學習項目。

+0

'std :: string :: substr'和'std :: string :: find'更好,因爲'strtok'實際上修改了字符串。 –

+0

我沒有看到任何關於不修改問題描述中的字符串的問題。 –

0

如果文件中的文本行長度相同,則可能需要將行作爲塊(即多行== 1塊)讀入緩衝區,然後搜索緩衝區。

您的性能瓶頸將從文件中讀取數據。一般來說,您選擇的搜索方法將比讀取數據更快。