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

Parsing comma seperated data of varying types in c++

本文关键字:分隔 数据 同类型 c++      更新时间:2023-10-16

我正在用C++编写。

我有一个逗号分隔的数据文件需要解析。每行有四个元素(因此有3个逗号),行数固定(约200)。我遇到的问题是,前两个元素是字符串数据类型,第三个元素是整数数据类型,最后一个元素是双精度类型。数据示例如下:

John Smith,PG,10400,41.4554
Jane Doe,PG,4500,32.4543
Charles Johnson,SG,8800,23.2323
Rick Grimes,C,10500,40.4550
….

类型:字符串,字符串,Int,双

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

非常感谢。

在读取结构化数据时,有时最好使用好的ol'scanf

沿着这些路线的东西可以完成这项工作:

char n[20], p[5];
int i;
double d;
scanf("%[^,], %[^,], %d, %lfn", n, p, &i, &d);

这里np是C字符串,如果需要,可以将它们转换为std::string

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

  • [^,]是一个说明符,很像正则表达式,它说:继续读取,直到找到,
  • 当你把,之类的额外东西放在变量之间时,scanf不会捕捉到它们,只需匹配并继续
  • 为什么最后是n?为了匹配换行并防止它被下一次扫描处理,这将使它输入名称变量

scanf对于结构化数据非常强大。参考文献更深入。

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

将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,%fn", elem1, elem2, elem3, elem4);
    // Use elem1, elem2, elem3 and elem4 the way you want to. 
  }
  return 0;
}