Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:读取csv文件并提取某些部分_C++_Csv_Extract - Fatal编程技术网

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

C++ C++;:读取csv文件并提取某些部分,c++,csv,extract,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 (strin

.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”,以双精度返回

我应该如何编写这个函数

编辑:以下是我迄今为止编写的代码:

    #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));
        }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
void main()
{
查找_和_摘录(W3005U00-X30BOJ00-1);
}
双重查找和提取(字符串sss)
{
矢量矢量阵列;
ifstream infle(“C:\\Data\\testdata.csv”);
弦节拍;
字符串内容;
字符csv_提取[40];
细流ss;
向量::迭代器ptr;
而(!infle.eof())
{ 
填充getline(csv_摘录,40);
ss>contnt;
矢量阵列。推回(续);
}
对于(ptr=vecarray.begin();ptr!=vecarray.end();ptr++)
{
if((*ptr).find(sss)==0)
temppo=(*ptr).substr(27,6);
}
返回(strtod(temppo.c_str(),NULL,0));
}

有人能帮我指出错误吗?

鉴于您已经将文件作为字符串,我将使用Knuth–Morris–Pratt算法查找密钥,找到该行上第3个分号和第4个分号的位置,并返回它们之间的字符串


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

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

首先:

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

签出strtok()。这实际上是一个非常琐碎的任务,如果你对C++仍然是新的,应该是一个好的学习项目。

如果文件中的文本行长度相同,你可能想把这些行作为块(即许多行=1块)读到一个缓冲区中,然后搜索缓冲区。p>
从文件中读取数据将导致性能瓶颈。一般来说,您选择的搜索方法比读取数据要快。

-1:您希望有人代替您完成工作吗?答案可能是-您应该使用众所周知的最佳实践编写此函数,牢记可维护性并处理可能出现的错误。我想说的是,
getline
substr
strtod
的组合将是一个选项。您能向我们展示您尝试过的功能吗,即使它不起作用?如果一开始就卡住了,请说明原因。
std::string::substr
std::string::find
更好,因为
strok
实际上修改了字符串。我在问题描述中没有看到任何关于不修改字符串的内容。