繁体   English   中英

如何在C ++中将CSV文件读入矢量

[英]How can I read CSV file in to vector in C++

我正在做将python代码转换为C ++的项目,以获得更好的性能。 该python项目名称为Advanced EAST,现在,我在.csv文件中获得了nms函数的输入数据,如下所示:

"[ 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]

一个单位是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);
    }

}

}

现在...我的代码emmmmmm无法正常工作,我对此一无所知...请帮助我将csv数据读取到我的代码中。 谢谢

不幸的是,在C ++中,解析字符串(以及因此的文件)非常繁琐。

我强烈建议您使用一个库,最好是一个仅标头的库, 例如这样的库。

如果您坚持要自己编写它,也许您可​​以从StackOverflow问题中汲取灵感,以了解如何在C ++中解析常规CSV文件。

您可以看一下getdelim(',', fin, line)

但是另一个问题将是那些引号,除非您/ know /始终以这种方式格式化文件,否则它将变得很困难。

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

如果不是引号,则可以使用getdelim() ,但是getdelim的自动分配功能意味着您必须使用另一个缓冲区。 在C ++中,我得到了所有getdelim结果片段的getdelim ,然后需要将它们连接起来以制成最终的字符串:

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

然后将所有这些字符串段重新连接在一起。

请注意,getdelim支持空字节。 如果您希望内容中包含空字节,并且不由字符序列\\000\\@表示,则需要存储getdelim返回的实际长度,并使用memcpy对其进行串联。

哦,如果您允许使用utf-8扩展引号,它将变得非常混乱!

这种情况不包括以\\\\"\\\\\\\\"结尾的字符串。 理想情况下,您需要对前导反斜杠的数量进行计数,如果计数为偶数,则接受报价。

请注意,这留下了将引号内容转义的问题,即将任何\\"转换为" ,并将\\\\转换为\\ ,等等。还丢弃了引号。

最后,如果您需要处理完全任意的内容,则库可能会更容易。 但是,如果内容是“已知的”,那么您可以没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM