在 C++ 中解析不同类型的逗号分隔数据

Parsing comma seperated data of varying types in c++

我正在用 C++ 编写。

我有一个逗号分隔的数据文件需要解析。每行有四个元素(所以 3 个逗号)和固定行数(大约 200)。我一直运行遇到的问题是前两个元素是string数据类型,第三个元素是integer数据类型,最后一个元素是double类型。数据示例如下:

约翰·史密斯,控球后卫,10400,41.4554
Jane Doe,PG,4500,32.4543
查尔斯·约翰逊,得分后卫,8800,23.2323
里克·格莱姆斯,中锋,10500, 40.4550
.....

类型:字符串、字符串、整数、双精度

对于我想要填充的每个元素,我都有一个数组。示例代码将不胜感激!

非常感谢。

当读取结构化数据时,有时可以使用 good ol' scanf.

按照这些思路可以完成这项工作:

char n[20], p[5];
int i;
double d;

scanf("%[^,], %[^,], %d, %lf\n", n, p, &i, &d);

这里的np是C字符串,如果需要可以转换成std::string

添加一些关于 scanf 字符串到底是什么的解释?

  • [^,] 是一个很像正则表达式的说明符:继续阅读直到找到 ,.
  • 当您在变量 scanf 之间添加诸如 , 之类的额外内容时,scanf` 不会捕获它们,只需匹配并继续
  • 为什么最后是 \n?为了匹配换行符并防止它被下一次扫描处理,这将使其输入名称变量。

scanf对于结构化数据真的很强大。更多 in-depth refs.

您也可以使用 regexp 执行此操作,然后将字符串标记分别转换为整数和双精度。

将 ifstream::getline 与 sscanf 结合使用。

#include <fstream>
#include <iostream>

int main()
{
  std::ifstream file;
  file.open("Data.txt");
   char line[100];
   char elem1[10], elem2[10];
   int elem3;
   double elem4;
   int linenum = 0;
  while (!file.eof()) {
    linenum++;
    file.getline(line, 100);
    sscanf(line, "%s,%s,%d,%f\n", elem1, elem2, elem3, elem4);
    // Use elem1, elem2, elem3 and elem4 the way you want to. 

  }
  return 0;
}