如何在Flutter中将蓝牙设备的多组数据保存到单个CSV文件?
解决单文件收集蓝牙数据并保存为CSV的问题
修改思路
- 固定CSV文件名,避免每次弹窗生成新文件
- 仅在文件首次创建时写入表头,后续仅追加新数据行
- 使用文件追加模式,防止覆盖已有数据
修改后的代码
// 定义固定的CSV文件路径(建议作为类成员变量,确保全局复用) String? _csvFilePath; setupMode.generateCsv((message) async { // 初始化文件路径(仅第一次执行时完成) if (_csvFilePath == null) { final String directory = (await getApplicationSupportDirectory()).path; _csvFilePath = "$directory/collected-data.csv"; } final File file = File(_csvFilePath!); final bool fileExists = await file.exists(); // 提取当前弹窗的数据集 List<String> dataRow = [ message.data[1], message.data[2], message.data[3], message.data[4] ]; String csvContent; if (!fileExists) { // 文件不存在时,写入表头+第一行数据 List<List<String>> dataWithHeader = [ ["No.", "X", "Y", "Z", "Z"], // 移除了原代码中Y前的多余空格 dataRow ]; csvContent = ListToCsvConverter().convert(dataWithHeader); } else { // 文件已存在时,仅转换当前数据行并追加(单独转一行避免重复表头) csvContent = ListToCsvConverter().convert([dataRow]) + "\n"; } // 写入或追加内容到文件 await file.writeAsString(csvContent, mode: fileExists ? FileMode.append : FileMode.write); print("数据已更新到CSV文件"); });
关键修改说明
- 固定文件路径:用成员变量
_csvFilePath保存唯一的文件路径,不再每次用时间戳生成新文件 - 表头仅写入一次:通过
file.exists()判断文件是否存在,首次创建时才写入表头 - 追加模式写入:使用
FileMode.append确保新数据不会覆盖已有内容,仅添加到文件末尾
内容的提问来源于stack exchange,提问作者ASMA
相关产品推荐
相关产品推荐

