如何正确拆分内容含分隔符的CSV文件,避免引号内逗号被错误分割
CSV行正确拆分方案
推荐方案:使用官方内置解析类
直接调用.NET 原生提供的TextFieldParser类即可完美适配CSV的引号转义规则,无需自己处理边界逻辑,支持所有标准CSV格式场景,代码如下:
// 需引入命名空间,.NET Core、.NET 5+及所有.NET Framework版本均原生支持,无需额外安装依赖 using Microsoft.VisualBasic.FileIO; using System.IO; // 你的CSV行数据 string line = "1111,\"Company Name\",\"Street 70\",\"Building Nr.1, 1st Floor, Room 34\",City,2213"; using var stringReader = new StringReader(line); using var csvParser = new TextFieldParser(stringReader); // 配置分隔符为逗号 csvParser.SetDelimiters(","); // 核心配置:开启引号包裹字段识别,会自动忽略引号内部的分隔符 csvParser.HasFieldsEnclosedInQuotes = true; // 读取得到的就是拆分完成的正确结果 string[] values = csvParser.ReadFields();
手动实现拆分逻辑(仅适用自定义轻量场景)
如果不想引入Microsoft.VisualBasic命名空间,可以自己实现拆分逻辑,核心是遍历字符时标记当前是否处于引号内部,仅拆分非引号区间的逗号:
using System.Text; using System.Collections.Generic; public static List<string> SplitCsvLine(string csvLine) { List<string> result = new List<string>(); StringBuilder currentField = new StringBuilder(); bool isInQuotes = false; foreach (char c in csvLine) { if (c == '"') { isInQuotes = !isInQuotes; currentField.Append(c); } else if (c == ',' && !isInQuotes) { result.Add(currentField.ToString()); currentField.Clear(); } else { currentField.Append(c); } } // 加入最后一个字段 result.Add(currentField.ToString()); return result; }
调用该方法传入CSV行字符串,即可得到符合预期的拆分结果。
内容的提问来源于stack exchange,提问作者Paul_412
相关产品推荐
相关产品推荐

