如何在C#中基于行首3字符规则将TXT转换为JSON?
C#实现大体积TXT按规则转JSON方案
针对大体积TXT文件转JSON的需求,核心是逐行处理避免内存溢出,同时根据行首3个字符匹配不同拆分规则。以下是完整实现方案:
1. 定义数据实体类
根据不同规则创建对应实体,示例字段可根据实际需求调整:
// 001道路信息(11项字段示例) public class RoadInfo { public string RoadId { get; set; } public string RoadName { get; set; } public string RoadType { get; set; } public string StartPoint { get; set; } public string EndPoint { get; set; } public decimal Length { get; set; } public decimal Width { get; set; } public string BuildYear { get; set; } public string MaintenanceUnit { get; set; } public string TrafficLevel { get; set; } public string Remark { get; set; } } // 004门牌号信息(9项字段示例) public class HouseNumberInfo { public string HouseId { get; set; } public string RoadCode { get; set; } public string HouseNo { get; set; } public string BuildingNo { get; set; } public string UnitNo { get; set; } public string FloorNo { get; set; } public string RoomNo { get; set; } public string ResidentCount { get; set; } public string PropertyUnit { get; set; } }
2. 核心解析逻辑
实现按行首前缀匹配拆分规则的方法,这里以固定长度拆分为例(如果是分隔符拆分,替换为Split逻辑即可):
public static object ParseLine(string line) { if (string.IsNullOrWhiteSpace(line) || line.Length < 3) return null; var prefix = line.Substring(0, 3); switch (prefix) { case "001": // 按固定长度拆分11项,示例长度需根据实际规则调整 return new RoadInfo { RoadId = line.Substring(3, 10).Trim(), RoadName = line.Substring(13, 20).Trim(), RoadType = line.Substring(33, 5).Trim(), StartPoint = line.Substring(38, 20).Trim(), EndPoint = line.Substring(58, 20).Trim(), Length = decimal.TryParse(line.Substring(78, 8).Trim(), out var len) ? len : 0, Width = decimal.TryParse(line.Substring(86, 6).Trim(), out var wid) ? wid : 0, BuildYear = line.Substring(92, 4).Trim(), MaintenanceUnit = line.Substring(96, 30).Trim(), TrafficLevel = line.Substring(126, 3).Trim(), Remark = line.Substring(129).Trim() }; case "004": // 按固定长度拆分9项,示例长度需根据实际规则调整 return new HouseNumberInfo { HouseId = line.Substring(3, 12).Trim(), RoadCode = line.Substring(15, 10).Trim(), HouseNo = line.Substring(25, 8).Trim(), BuildingNo = line.Substring(33, 6).Trim(), UnitNo = line.Substring(39, 4).Trim(), FloorNo = line.Substring(43, 3).Trim(), RoomNo = line.Substring(46, 5).Trim(), ResidentCount = line.Substring(51, 4).Trim(), PropertyUnit = line.Substring(55).Trim() }; default: // 处理未知前缀的行,可忽略或记录日志 return null; } }
3. 大文件读写与JSON输出
使用流操作逐行处理,避免一次性加载所有数据到内存:
using System.Text.Json; public static void ConvertTxtToJson(string txtPath, string jsonPath) { var options = new JsonSerializerOptions { WriteIndented = true }; using var reader = new StreamReader(txtPath, Encoding.UTF8); using var writer = new StreamWriter(jsonPath, false, Encoding.UTF8); // 写入JSON数组开头 writer.WriteLine("["); string line; bool isFirstItem = true; while ((line = reader.ReadLine()) != null) { var data = ParseLine(line); if (data == null) continue; // 处理数组逗号分隔 if (!isFirstItem) writer.WriteLine(","); else isFirstItem = false; // 序列化当前对象并写入 var json = JsonSerializer.Serialize(data, options); writer.Write(json); } // 写入JSON数组结尾 writer.WriteLine(); writer.WriteLine("]"); }
4. 关键注意事项
- 内存优化:全程使用流操作,适合GB级大文件处理,避免内存溢出。
- 编码适配:根据实际TXT文件编码调整
StreamReader的编码参数(如Encoding.GB2312)。 - 异常处理:可在循环中添加
try-catch块,捕获解析或IO异常并记录日志,避免程序崩溃。 - 规则扩展:后续新增前缀规则时,只需在
ParseLine的switch中添加新分支即可。
内容的提问来源于stack exchange,提问作者Selena
相关产品推荐
相关产品推荐

