2011-08-18 99 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块)读入缓冲区,然后搜索缓冲区。

您的性能瓶颈将从文件中读取数据。一般来说,您选择的搜索方法将比读取数据更快。