使用CsvHelper处理特殊CSV:表头列转数据列的技术问询
CSV非标准格式转换解决方案
原始问题场景
你的CSV是非标准结构,示例如下:
Characteristics: Appearance:,Null Type:,Null ...
需要转换成两种目标格式之一:
- 每个表头单独一行,对应数据在下一行
- 所有表头在同一行,对应数据在下方一行
以下是两种格式的具体实现方案(以C#为例):
方案一:每个表头单独一行,对应数据在下一行
直接逐行读取原始CSV,跳过无关的标题行,拆分每行的表头和值后分别写入新文件:
using (var reader = new StreamReader("input.csv")) using (var writer = new StreamWriter("output_format1.csv")) { // 跳过第一行的"Characteristics:" reader.ReadLine(); string line; while ((line = reader.ReadLine()) != null) { if (string.IsNullOrWhiteSpace(line)) continue; // 按逗号拆分表头和值,最多拆2部分 var parts = line.Split(',', 2); if (parts.Length == 2) { // 移除表头末尾的冒号,写入表头行 var cleanHeader = parts[0].TrimEnd(':'); writer.WriteLine(cleanHeader); // 写入对应的数据值 writer.WriteLine(parts[1].Trim()); } } }
转换后示例:
Appearance Null Type Null ...
方案二:所有表头一行,对应数据一行
先收集所有表头和对应的值,再分别整行写入:
using (var reader = new StreamReader("input.csv")) using (var writer = new StreamWriter("output_format2.csv")) { // 跳过无关的标题行 reader.ReadLine(); var headers = new List<string>(); var values = new List<string>(); string line; while ((line = reader.ReadLine()) != null) { if (string.IsNullOrWhiteSpace(line)) continue; var parts = line.Split(',', 2); if (parts.Length == 2) { headers.Add(parts[0].TrimEnd(':')); values.Add(parts[1].Trim()); } } // 写入表头行 writer.WriteLine(string.Join(",", headers)); // 写入对应的数据行 writer.WriteLine(string.Join(",", values)); }
转换后示例:
Appearance,Type,... Null,Null,...
关于你之前的PrepareHeaderForMatch尝试
你之前的代码逻辑有误:PrepareHeaderForMatch = header => Regex.Replace("null", "\n") 把参数写反了,而且这个方法是用于CsvHelper中匹配表头时的预处理,并不适合你这种重构整个CSV结构的需求,直接逐行处理文本更高效直接。
内容的提问来源于stack exchange,提问作者Kevin Jablowski
相关产品推荐
相关产品推荐

