CSV文件行标记实现方案咨询:确保数据仅单次API提交
需求与问题
- 学校作业场景:需逐行读取CSV文件(不全部加载至内存),解析后将数据提交至API
- 核心约束:每条数据仅允许提交一次,需要在发送前标记待处理数据、提交后标记已完成数据
- 当前困境:未找到可行的标记实现方案,曾考虑将已完成数据写入独立文件,通过对比跳过已处理行,现有核心代码如下:
if (File.Exists(@"C:\Users\Desktop\Book1.csv")) { using (StreamReader sr = new StreamReader(@"C:\Users\Desktop\Book1.csv")) { string line; while (!sr.EndOfStream) { //split the line by comma line = sr.ReadLine(); string[] split = line.Split(','); Field f1 = new Field(); Field f2 = new Field(); Payload payload = new Payload(new List<Field>() { f1, f2 }, DateTime.UtcNow, DateTime.UtcNow); //Prepare the payload string json = JsonSerializer.Serialize(payload); var response = Request.Post(json); if (response.Result != true) { tsError.TraceEvent(TraceEventType.Error, 3, "Error Occured"); } else { ts.TraceInformation("completed"); } ts.Flush(); tsError.Flush(); } }}
可行实现思路
方案1:独立标记文件记录已处理标识
- 为CSV每行生成唯一标识(比如行号+数据哈希值,避免重复数据误判)
- 用文本文件或轻量数据库(如SQLite)存储已成功提交的行标识
- 读取CSV前,先将已完成标识加载到内存集合(内存占用极低)
- 逐行读取CSV时,先计算当前行标识,若已在集合中则跳过;提交成功后将标识写入标记存储
方案2:修改原CSV添加状态列
- 在CSV末尾新增
status列,值设为pending(初始)、completed(提交成功)、failed(提交失败) - 读取时直接跳过
status为completed的行 - 提交成功后,通过记录行偏移量,用
FileStream定位当前行并更新status为completed;失败则标记为failed - 注意:需避免覆盖整个文件,采用随机访问方式修改指定行
方案3:临时文件分阶段处理
- 初始将原CSV复制为「待处理文件」,同时创建「已完成文件」和「错误文件」
- 每次读取待处理文件的一行,提交成功后将该行追加写入已完成文件,并从待处理文件删除该行;失败则写入错误文件
- 待处理文件为空时任务完成,后续重启直接从待处理文件继续执行
内容的提问来源于stack exchange,提问作者zzzz
相关产品推荐
相关产品推荐

