C ++:读取csv文件并提取一些部分

时间:2011-08-18 12:44:45

标签: c++ csv extract

.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));
        }

有人可以帮我指出错误吗?

4 个答案:

答案 0 :(得分:0)

看到你已经将文件作为字符串,我会使用Knuth-Morris-Pratt算法找到关键字,在该行找到第3和第4个分号的位置并在其间返回字符串它们。

这只是一个大纲 - 你需要添加错误处理。

答案 1 :(得分:0)

您可以使用sed:这样,您可以非常有效地搜索密钥,而无需自己实现算法。找到密钥后,可以让sed输出所需行的部分(使用正则表达式来描述模式和分组,只打印部分内容)。之后,它是一个简单的浮点转换字符串,可以用您选择的编程语言完成。

首先:

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

答案 2 :(得分:0)

结帐strtok()。这实际上是一项非常简单的任务,如果您还是C ++的新手,这应该是一个很好的学习项目。

答案 3 :(得分:0)

如果文件中的文本行长度相同,您可能希望将这些行作为块(即多行== 1块)读入缓冲区,然后搜索缓冲区。

您的性能瓶颈是从文件中读取数据。通常,您选择的搜索方法比读取数据更快。