【问题标题】:C++ : read a csv file and extract some partsC++:读取一个 csv 文件并提取一些部分
【发布时间】:2011-08-18 12:44:45
【问题描述】:

.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文件中逐行搜索,找到对应的行(本例应该是第三行),并提取该行中的某些部分“+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));
        }

谁能帮我指出错误?

【问题讨论】:

  • -1:你希望有人代替你做你的工作吗?答案可能是——你应该使用众所周知的最佳实践来编写这个函数,牢记可维护性并处理可能的错误。
  • 我会说getlinesubstrstrtod 的组合是一种选择。
  • 你能告诉我们你尝试了什么,即使它不起作用?如果您一开始就卡住了,请说明这一点,以及卡住的原因。

标签: c++ csv extract


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    查看strtok()。这实际上是一项非常微不足道的任务,如果您还是 C++ 新手,这应该是一个很好的学习项目。

    【讨论】:

    • std::string::substrstd::string::find 更好,因为 strtok 实际上修改了字符串。
    • 我没有看到任何关于不修改问题描述中的字符串。
    【解决方案3】:

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

    对于初学者:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        • 2022-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多