CSV的二进制版本

时间:2015-07-19 04:32:43

标签: 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

实际上,我搜索了文件格式,发现上面的文件格式被称为 csv(逗号分隔值)

由于csv将数据记录为纯文本,因此人类可以轻松读取数据。

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

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

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

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

你认识一个人吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

您正在寻找Scientific data exchange format,因为这种数据是计算科学所特有的。

您肯定要采用文件标准,因为CSV因能够使用许多不同的工具进行读写而广受欢迎。一种流行的选择是 HDF5 file format 。存在用于任何流行编程语言的HDF5库。 HDF5在存储(许多 n 维)表和关联的元数据方面表现特别出色。

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

#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;
}

在此特定示例中,实际上是写入了 binary 数据:

$ hexdump test.bin 
0000000 5630 c33b                              

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

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