3、数据格式设计:CSV格式详解、JSON格式详解、自定义二进制格式、选择合适的数据格式

数据格式这事儿,看着简单,其实坑不少。我刚开始做温室项目时,觉得随便选个格式存就完事了。结果呢?数据量一上来,读取慢得让人抓狂。今天咱们就把几种常见格式掰开揉碎了聊聊。

3.1 CSV格式详解

CSV,说白了就是逗号分隔的文本文件。简单、直观,谁都能看懂。

基本结构

时间戳,温度(℃),湿度(%),光照(lux),CO2(ppm)
2024-01-15 08:00:00,25.3,68.5,12000,420
2024-01-15 08:05:00,25.6,67.8,12500,418
2024-01-15 08:10:00,25.8,67.2,13100,415

优点

  • 人类可读,Excel直接打开
  • 跨平台兼容性极好
  • 文件体积相对较小

缺点

  • 没有数据类型定义,所有字段都是字符串
  • 浮点数精度可能丢失
  • 不支持嵌套结构

我的经验:CSV适合做数据交换的中间格式。比如从传感器采集后,先存成CSV,再导入数据库。但别拿它当长期存储格式,尤其是数据量超过10万行时,读写效率会明显下降。

3.2 JSON格式详解

JSON现在可是Web世界的通用语言。我习惯用它来存储带元数据的数据集。

示例结构

{
  "device_id": "GH-001",
  "location": "3号温室",
  "timestamp": "2024-01-15T08:00:00Z",
  "sensors": {
    "temperature": {
      "value": 25.3,
      "unit": "℃",
      "status": "normal"
    },
    "humidity": {
      "value": 68.5,
      "unit": "%",
      "status": "normal"
    }
  },
  "alerts": []
}

优点

  • 支持嵌套结构,表达能力强
  • 有明确的数据类型(数字、字符串、布尔值)
  • JavaScript原生支持,前端处理方便

缺点

  • 文件体积比CSV大30%-50%
  • 解析速度比CSV慢
  • 没有注释功能

注意:JSON里不要放太多嵌套层级。我曾经见过一个项目,JSON嵌套了8层,解析时内存直接爆了。建议控制在3层以内。

3.3 自定义二进制格式

嗯,这个就有点硬核了。但说实话,在嵌入式设备上,二进制格式才是王道。

设计思路

// 数据包结构定义
typedef struct {
    uint32_t timestamp;    // Unix时间戳,4字节
    float    temperature;  // 温度,4字节
    float    humidity;     // 湿度,4字节
    uint16_t light;       // 光照,2字节
    uint16_t co2;         // CO2浓度,2字节
    uint8_t  status;      // 设备状态,1字节
} __attribute__((packed)) SensorData;

// 总大小:17字节

优点

  • 体积最小,同样数据比CSV小80%
  • 解析速度最快,直接内存映射
  • 适合带宽有限的物联网场景

缺点

  • 人类不可读,调试困难
  • 跨平台需要处理字节序
  • 扩展性差,改结构就要改解析代码

避坑指南:我曾经在STM32上设计二进制格式时,忘了处理字节对齐问题。结果在PC上解析的数据全是错的。记住:一定要用 __attribute__((packed)) 或者手动填充对齐字节。

3.4 如何选择合适的数据格式

这个问题没有标准答案,得看场景。我一般按这个思路来选:

场景 推荐格式 原因
设备端采集存储 二进制 节省存储空间,写入速度快
数据上传到服务器 JSON 便于解析,支持元数据
数据分析导出 CSV 兼容Excel和数据分析工具
长期归档存储 二进制+索引 体积小,查询快
前后端数据交换 JSON Web生态标准

我的建议

  • 别只用一种格式。我现在的做法是:设备端存二进制,上传时转JSON,分析时导出CSV。
  • 考虑数据生命周期。实时数据用二进制,历史数据用CSV,配置数据用JSON。
  • 测试一下再决定。拿真实数据跑一遍,看看读写速度、文件大小、解析时间。

小技巧:如果你不确定选哪个,先用JSON。后期性能不够了,再优化成二进制。别一开始就搞复杂了,你想想看,项目还没跑起来呢,先把自己累死了。

数据格式这事儿,说白了就是空间和时间的权衡。选对了,事半功倍;选错了,后面改起来真要命。我个人建议,先想清楚你的数据要经历哪些环节,再决定格式。别一上来就拍脑袋。