类似CSV的格式,支持多个"表"和"命名引用"的C库

CSV-like format wit C library supporting multiple "tables" and "named references

本文关键字:引用 格式 CSV 支持 类似      更新时间:2023-10-16

我有一些数据要提供给C/c++程序,我可以很容易地将其转换为CSV格式。然而,我需要对CSV标准或我所知道的部分进行一些扩展。

数据是异构的,存在不同大小的不同参数。它们可以是1值、向量或多维数组。我的理想格式是这样的

--+ Size1
2
--+ Size2
4
--+Table1
1;2;3;4
5;6;7;8
--+Table2
1;2

"——+"是某种分隔符。我有两个1值参数,分别命名为Size1和Size2,还有两个多维参数Table1和Table2。在本例中,表1和表2的维度由另外两个参数给出。还可以命名行和列,即可以有一个表,如

--+Table3
A;B
X;1;2
Y;4;5

其中element ("A","X")为1,element ("B","X")为2,以此类推。

换句话说,它就像一系列附加的CSV文件,带有表、行和列的名称。

解析器应该能够利用文件的结构,允许我编写这样的代码:

parse(my_parser,"Size1",&foo->S1); // read Size1 value and write it in &foo.S1
parse(my_parser,"Size2",&foo->S2); // read Size2 value and write it in &foo.S2
foo->T2=malloc(sizeof(int)*(foo->S1)); 
parse(my_parser,"Table2",foo->T2); // read Table2

如果它能够存储行和列的名称,那将是一个额外的奖励。

我不认为写这样一个库会花费很多,但是我有更重要的事情要做。

是否已经定义了像这样的格式?使用c++的开源库?你对我的问题有其他的建议吗?

提前感谢。

a .

我会使用JSON, boost很容易处理。标量是数组的一种简单形式[2]

数组很简单[1,2]

多维[[1,2,3,4], [5,6,7,8]]

我已经有一段时间没有做这种事情了,所以我不确定代码将如何为您分解。当然,通过扩展,您可以添加行/列名。代码将非常漂亮,也许不像python那样不需要动脑筋,但它应该很简单。

这里是JSON格式的链接:http://json.org这里有一个使用boost读取JSON的stackoverflow链接:使用boost读取JSON文件

一个不错的选择是YAML。

它是一种众所周知的、对人类友好的编程语言数据序列化标准。

它非常适合你的需要:YAML语法被设计成很容易映射到大多数高级语言常见的数据类型:向量,关联数组和标量:

Size1: 123
---
Table1: [[1.0,2.0,3.0,4.0], [5.0,6.0,7.0,8.0]]

有很好的C、c++和许多其他语言的库。要了解如何使用它,请参阅c++教程。

对于互操作性,你也可以考虑OpenCV使用YAML格式的方式:

%YAML:1.0
frameCount: 5
calibrationDate: "Fri Jun 17 14:09:29 2011n"
cameraMatrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 1000., 0., 320., 0., 1000., 240., 0., 0., 1. ]

由于JSON和YAML有许多相似之处,您还可以看一下:YAML和JSON之间的区别是什么?

感谢大家的建议。

数据主要是数字,有很多维度,考虑到它的大小,用这些文本格式解析可能很慢,我发现目前最快捷、最干净的方法是使用数据库。

我仍然认为这可能是矫枉过正,但我认为现在没有明显更好的替代方案。