如何将CSV文件读入C++; 我正在做一个将Python代码转换成C++的项目,以获得更好的性能。python项目名称是Adcvanced EAST,目前,我获得了nms函数的输入数据,在.csv文件中,如下所示: "[ 5.9358170e-04 5.2773970e-01 5.0061589e-01 -1.3098677e+00 -2.7747922e+00 1.5079222e+00 -3.4586751e+00]","[ 3.8175487e-05 6.3440394e-01 7.0218205e-01 -1.5393494e+00 -5.1545496e+00 4.2795391e+00 -3.4941311e+00]","[ 4.6003381e-05 5.9677261e-01 6.6983813e-01 -1.6515008e+00 -5.1606908e+00 5.2009044e+00 -3.0518508e+00]","[ 5.5172237e-05 5.8421570e-01 5.9929764e-01 -1.8425952e+00 -5.2444854e+00 4.5013981e+00 -2.7876694e+00]","[ 5.2929961e-05 5.4777789e-01 6.4851379e-01 -1.3151239e+00 -5.1559062e+00 5.2229333e+00 -2.4008298e+00]","[ 8.0250458e-05 6.1284608e-01 6.1014801e-01 -1.8556541e+00 -5.0002270e+00 5.2796564e+00 -2.2154367e+00]","[ 8.1256607e-05 6.1321974e-01 5.9887391e-01 -2.2241254e+00 -4.7920742e+00 5.4237065e+00 -2.2534993e+00]

如何将CSV文件读入C++; 我正在做一个将Python代码转换成C++的项目,以获得更好的性能。python项目名称是Adcvanced EAST,目前,我获得了nms函数的输入数据,在.csv文件中,如下所示: "[ 5.9358170e-04 5.2773970e-01 5.0061589e-01 -1.3098677e+00 -2.7747922e+00 1.5079222e+00 -3.4586751e+00]","[ 3.8175487e-05 6.3440394e-01 7.0218205e-01 -1.5393494e+00 -5.1545496e+00 4.2795391e+00 -3.4941311e+00]","[ 4.6003381e-05 5.9677261e-01 6.6983813e-01 -1.6515008e+00 -5.1606908e+00 5.2009044e+00 -3.0518508e+00]","[ 5.5172237e-05 5.8421570e-01 5.9929764e-01 -1.8425952e+00 -5.2444854e+00 4.5013981e+00 -2.7876694e+00]","[ 5.2929961e-05 5.4777789e-01 6.4851379e-01 -1.3151239e+00 -5.1559062e+00 5.2229333e+00 -2.4008298e+00]","[ 8.0250458e-05 6.1284608e-01 6.1014801e-01 -1.8556541e+00 -5.0002270e+00 5.2796564e+00 -2.2154367e+00]","[ 8.1256607e-05 6.1321974e-01 5.9887391e-01 -2.2241254e+00 -4.7920742e+00 5.4237065e+00 -2.2534993e+00],c++,csv,vector,nms,C++,Csv,Vector,Nms,一个单位是7个数字,但前四个数字后面有一个“\n”, 我想把这个CSV文件读入我的C++项目, 这样我就可以在C++中完成数学运算,使它更快。 using namespace std; void read_csv(const string &filename) { //File pointer fstream fin; //open an existing file fin.open(filename, ios::in); vector<vector<vector<

一个单位是7个数字,但前四个数字后面有一个“\n”, 我想把这个CSV文件读入我的C++项目, 这样我就可以在C++中完成数学运算,使它更快。
using namespace std;

void read_csv(const string &filename)
{
//File pointer
fstream fin;
//open an existing file
fin.open(filename, ios::in);

vector<vector<vector<double>>> predict;

string line;
while (getline(fin, line))
{
    std::istringstream sin(line);
    vector<double> preds;
    double pred;
    while (getline(sin, pred, ']'))
    {
        preds.push_back(preds);
    }

}
使用名称空间std;
无效读取\u csv(常量字符串和文件名)
{
//文件指针
流鳍;
//打开现有文件
打开(文件名,ios::in);
矢量预测;
弦线;
while(getline(fin,line))
{
标准::istringstream sin(线);
矢量pred;
双pred;
while(getline(sin,pred,']'))
{
preds.推回(preds);
}
}
}

现在…我的代码不起作用了, 我完全不知道这个。。。 请帮助我将csv数据读入我的代码。
谢谢

您可以查看
getdelim(“,”,fin,line)

但是另一个问题是那些引号,除非你/知道/文件总是以这种方式格式化,否则它会变得很困难

我在过去使用过一个不完美的技巧,如果第一个字符是引号,那么逗号前的最后一个字符也必须是匹配的引号,而不是转义

如果它不是引号,则
getdelim()
更多,但getdelim的自动分配功能意味着您必须使用另一个缓冲区。在C++中,我得到一个向量的所有代码:<代码> GETDelm < /Cord>结果,然后需要连接以生成最后的字符串:

std::vector<char*> gotLine;
gotLine.push_back(malloc(2));
*gotLine.back() = fgetch();
gotLine.back()[1] = 0;
bool gotquote = *gotLine.back() == '"'; // perhaps different classes of quote
if (*gotLine.back() != ',')
 for(;;)
 {
  char* gotSub= nullptr;
  gotSub=getdelim(',');
  gotLine.push_back(gotSub);
  if (!gotquote) break;
  auto subLen = strlen(gotSub);
  if (subLen>1 && *(gotSub-1)=='"') // again different classes of quote
    if (sublen==2 || *(gotSub-2)!='\\') // needs to be a while loop
       break;
 }
std::vector gotLine;
后推(malloc(2));
*gotLine.back()=fgetch();
gotLine.back()[1]=0;
bool gotquote=*gotLine.back()=''”;//可能是不同的quote类
如果(*gotLine.back()!=',')
对于(;;)
{
char*gotSub=nullptr;
gotSub=getdelim(',');
gotLine.向后推(gotSub);
如果(!gotquote)中断;
自动转租=strlen(gotSub);
如果(subLen>1&&*(gotSub-1)=='''”)//又是不同类别的引号
if(sublen==2 | |*(gotSub-2)!='\\')//需要是一个while循环
打破
}
然后将所有这些字符串段重新连接在一起

注意,getdelim支持空字节。如果内容中需要空字节,而不是由字符序列
\000
\@
表示,则需要存储getdelim返回的实际长度,并使用memcpy将它们连接起来

哦,如果你允许utf-8扩展引号,它会变得非常混乱

这不包括以
\\\“
\\\\”
结尾的字符串。理想情况下,您需要计算前导反斜杠的数量,如果计数为偶数,则接受引号

请注意,这留下了删除引用内容的问题,即将任何
\“
转换为
,以及将
\\
转换为
\
,等等。同时也丢弃所附的引用


最后,如果需要处理完全任意的内容,库可能会更容易。但是如果内容是“已知的”,你就可以生存下去。

< p>不幸的是,解析字符串(以及文件)在C++中非常繁琐。 我强烈建议使用一个库,最好是一个只有头的库


<>如果你坚持自己写,也许你可以从如何解析C++中的普通CSV文件中得到一些启发。CSV是一种看似简单的格式,但由于有太多的角点和特殊情况,所以解析它并不容易。对于您的输入尤其如此,因为它是以非常规方式格式化的(似乎是Python脚本的一些内部数据在控制台上的直接转储)。将
getline(fin,string,']')
的输出馈送到
stringstream
。丢弃第一个单词,读两遍,直到流结束。这是一项记录。对其余部分重复。请注意,
getdelim
是一个POSIX特定的函数,它在例如Windows上不存在。@Someprogrammerdude fair point。我的医生只说>