c++中csv文件的写入和读取

env_ 是开放空间规划前对环境信息的存储 用来给MyEnvironment my_env;赋值

什么是CSV?

​ CSV 是一种以纯文本形式存储的表格数据,具体介绍如下(来自维基百科):

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。

​ 简单的说,CSV 是一种通用的、相对简单的表格文件格式,最广泛的应用就是在不同程序之间转移表格数据。值得注意的是,CSV 并没有一种单一的、定义明确的格式(虽然有一个 RFC 4180 的定义),一般地,CSV 文件具有如下特征:

  1. 纯文本,使用某个特定的字符集保存,例如 ASCII、Unicode 等
  2. 由一条条记录组成,一般每一行代表一条记录
  3. 每条记录被分隔符划分为不同的字段,最常见的分隔符是逗号,毕竟其中文名叫逗号分隔值:)
  4. 每条记录相同的字段序列

因为CSV 文件并没有一种单一的、定义明确的格式,因此下面的内容以最常见的格式为例,即逗号(,)分隔字段,换行符(\n)分隔记录。

示例主要将一个二维数组存入到CSV文件中。

#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
 
int main()
{
	int a[2][3] = { 1, 2, 3, 4, 1,2};
 
	int lines, row, column;
 
	lines = sizeof(a) / sizeof(a[0][0]);  // 数组数据总数
	row = sizeof(a) / sizeof(a[0]);       // 行
	column = lines / row;                 // 列
 
	// 向csv文档中写入数据
    ofstream dataFile;
	dataFile.open("test.csv", ios::out | ios::trunc);
    dataFile << "x"
        << ","
        << "y"
        << ","
        << "z"
		 << std::endl;
	for (int i = 0; i < row; i = i + 1)
	{
		for (int j = 0; j < column; j = j + 1)
		{
			dataFile << a[i][j] << ",";          // 写入数据
		}
		dataFile <<  endl;                       // 换行
	}
	
	dataFile.close();                            // 关闭文档
 
}

输出结果:

image-20221002152226716

常见的CSV文件的分隔符是逗号(,),被分隔符分开的字段会位于不同的列。在上述语句中,x、y、z被分隔符分开,因此这个CSV文件共有3列,分别是x、y、z。

CSV文件是由一条条记录组成的,常见划分不同记录的符号是换行符(\n)。在上述语句中,x、y、z 分别属于同一行上的不同三列,很显然,这条记录是表头。

用Plotjuggler显示机器人路径

保存机器人轨迹为CSV文件

使用下面的示例代码来存储机器人的位置。存储其他数据也可以用类似的方法。

#include <fstream>
#include <ios>
#include <iostream>
#include <string>
#include <vector>

struct Pose
{
    double x;
    double y;
}

void saveCvsFile(std::string file_name, std::vector<Pose> path)
{
    std::ofstream outfile;
    outfile.open(file_name.c_str(), std::ios::trunc);
    outfile << "x"
        << ","
        << "y"
        << ","
        << "yaw"
        << ","
        << "num" << std::endl;
    int num_count = 0;
    for (int i = 0; i < path->size(); ++i)
    {
        outfile << path->at(i).x << "," << path->at(i).y << ","  
            << path->at(i).yaw << "," << num_count << std::endl;
        num_count++;
    }
    outfile.close();
}

image-20221002153426807

在plotjugger中显示路径:

image-20221002154557435

image-20221002154631671

参考文章

C语言读取写入CSV文件 [一]基础篇

数据回放伴侣Rviz+plotjuggler

posted @ 2022-10-10 21:43  北极星!  阅读(3351)  评论(0编辑  收藏  举报