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。后期性能不够了,再优化成二进制。别一开始就搞复杂了,你想想看,项目还没跑起来呢,先把自己累死了。
数据格式这事儿,说白了就是空间和时间的权衡。选对了,事半功倍;选错了,后面改起来真要命。我个人建议,先想清楚你的数据要经历哪些环节,再决定格式。别一上来就拍脑袋。