.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));
}
有人可以帮我指出错误吗?
答案 0 :(得分:0)
看到你已经将文件作为字符串,我会使用Knuth-Morris-Pratt算法找到关键字,在该行找到第3和第4个分号的位置并在其间返回字符串它们。
这只是一个大纲 - 你需要添加错误处理。
答案 1 :(得分:0)
您可以使用sed:这样,您可以非常有效地搜索密钥,而无需自己实现算法。找到密钥后,可以让sed输出所需行的部分(使用正则表达式来描述模式和分组,只打印部分内容)。之后,它是一个简单的浮点转换字符串,可以用您选择的编程语言完成。
首先:
sed -n 's/RegexToMatchYourKeyAndValues/MatchedValues/p'
答案 2 :(得分:0)
结帐strtok()
。这实际上是一项非常简单的任务,如果您还是C ++的新手,这应该是一个很好的学习项目。
答案 3 :(得分:0)
如果文件中的文本行长度相同,您可能希望将这些行作为块(即多行== 1块)读入缓冲区,然后搜索缓冲区。
您的性能瓶颈是从文件中读取数据。通常,您选择的搜索方法比读取数据更快。