说起c++做csv文件的读写,要我来说不就是个按行读取然后用逗号分隔嘛。
可是想想呢又觉得麻烦,代码嘛,多迭代,多复用,没有必要自己写,万一不靠谱还得找bug,多不方便。
所以咯,我没事就去github逛逛,看看大家都在分享什么代码,然后就找到了它
说来也是奇怪,第一次看这个只有头文件的csv库时我眼晕得很,心说,怎么写得这么麻烦?
然后一看,哦~~还是有点意思的,做了多线程读取呢
那么简单的翻译一下这个Fast C++ CSV Parser吧
这是一个又小,又好用,而且只有个头文件的逗号分隔值【comma separated value(CSV)】读取库哦。
特点如下:
- 可以按照标题将不同列的信息解析出来
- 可以使用多线程技术读取CSV文件并且解析
- 可以在编译时使用模板启用和禁用解析功能(例如转义字符串),按需定制功能。
- 可以在合理的时间内读取多个GB大小的文件。
- 支持自定义列分隔符(即支持制表符分隔值文件),引用转义字符串,自动空格修剪。
- 使用* nix和Windows换行符,并自动忽略UTF-8 BOM。
- 具有足够上下文以格式化有用的错误消息的异常类。 what()返回错误消息准备好显示给用户。
下面是一个简单的例子,来自github1
# include "csv.h"
int main()
{
io::CSVReader<3> in("ram.csv");//3是有几列,括号里面是文件名
in.read_header(io::ignore_extra_column, "vendor", "size", "speed");//确定列的名字,事先得看一下csv文件里面怎么定义
//in.next_line()如果不想读取标题,可以用这句
std::string vendor; int size; double speed;//随便定义一些变量
//注意,上面的变量目前只支持c++自带的一些类型,可以看
while(in.read_row(vendor, size, speed)){
// do stuff with the data
}
}
有几个要注意的东西:
- 文件名可以用
char*
或者std::string
- 列的标题一般用
char*
或者std::string
,其他的暂时不支持 - 如果不想读取列标题,可以使用next_line()这个函数,但是后面的read_row()函数就是按顺序读取了。
bool read_row(ColType1&col1, ColType2&col2, ...)
函数支持的数据类型:
- signed char, short, int, long and long long
- unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long
- float, double, long double
- char
- std::string
- char*
目前只有这些类型受支持,如果有大神愿意commit一个模版也是极好的。
别的嘛,暂时没有了,我只用了这些
对了如果要使用多线程记得在编译的时候链-lpthread
例如像作者在readme里面写的那样:
g++ -std=c++0x a.o b.o -o prog -lpthread
如果不想使用呢,可以在头文件里面define 一下
#define CSV_IO_NO_THREAD