CSV的二进制版本

问题描述 投票:0回答:1

我想询问一种文件格式,它可以方便地进行数据记录。

例如,我必须记录轨迹数据,数据将是这样的。

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)。

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

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

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

你认识的人吗?

谢谢。

csv file-format
1个回答
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;
}

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

$ hexdump test.bin 
0000000 5630 c33b                              

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

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

© www.soinside.com 2019 - 2024. All rights reserved.