在 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);
这里的n
和p
是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;
}
我正在用 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);
这里的n
和p
是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;
}