CSV 的二进制版本

Jae*_*LEE 5 csv file-format

我想询问一种方便数据记录的文件格式。

例如,我要记录轨迹数据,数据会是这样的。

t, x, y, z
0.001, 0.1, 0.2, 0.3
0.002, 0.11, 0.19, 0.31
0.003, 0.13, 0.16, 0.35
Run Code Online (Sandbox Code Playgroud)

实际上,我搜索了有关文件格式的信息,发现上述文件格式称为csv(逗号分隔值)

由于 csv 将数据记录为纯文本,因此数据很容易被人类读取。

但有时需要长数字来记录数据(即15931548831、1248.128657)。

并且需要的数字越长,写入文件所需的时间就越长。

因此,我需要一种满足以下条件的文件格式。

  • 数据应该或可以以纯二进制形式记录
  • 文件中应包含元数据(即数据名称、记录日期)。

你认识什么人吗?

谢谢。

Nil*_*ils 1

您正在寻找一种科学数据交换格式,因为这种数据是计算科学的典型数据。

您当然希望采用文件标准,因为 CSV 因其能够使用许多不同的工具进行读写而广受欢迎。HDF5 文件格式是一种流行的选择。任何流行的编程语言都存在 HDF5 库。HDF5 在存储(许多n维)表和关联元数据方面表现尤其出色。

有些人做的另一个典型选择是序列化为二进制浮点数。在 C++ 中,这将被存档为(来源:C++ 论坛

#include <iostream>
#include <fstream>

int main()
{
  float f1 = -187.33667, f2 = 0.0;
  std::ofstream out("test.bin",std::ios_base::binary);
  if(out.good())
  {
    std::cout << "Writing floating point number: " << std::fixed << f1 << std::endl;
    out.write((char *)&f1,sizeof(float));
    out.close();
  }
  std::ifstream in("test.bin",std::ios_base::binary);
  if(in.good())
  {
    in.read((char *)&f2,sizeof(float));
    std::cout << "Reading floating point number: " << std::fixed << f2 << std::endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这个特定的示例中,写入的是真正的二进制数据:

$ hexdump test.bin 
0000000 5630 c33b                              
Run Code Online (Sandbox Code Playgroud)

如您所见,该文件需要4 个字节的存储空间,而不是存储 ASCII 字符时所需的 11 个字节(11 个字符)-187.33667。有了这个概念(自定义读取器和写入器),您还可以有效地存储数字表,当然这就是 HDF5 等文件格式在幕后工作的方式。

有一些科学代码可以实现这样的自定义文件格式,但我强烈建议不要采用自定义文件格式,因为它们容易出错,难以调试、检查,并且在编写工具方面非常耗时。